在我目前的位置上,我遇到了一个需要分配tlc的数据库,至少可以说,有许多交叉引用表都具有相同的结构模式,并且都使用触发器来强制执行业务逻辑或域完整性。我想知道是否可以用约束替换一些触发器。下面是符合此模式的典型表定义。这些表中大约有400个都使用相同的基于触发器的解决方案。

CREATE TABLE dbo.FooXRef
(
FooXRefID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
BarID INT NOT NULL CONSTRAINT [fk_Bar] FOREIGN KEY REFERENCES dbo.Bar(BarID),
DefaultRecord BIT NOT NULL CONSTRAINT [DF_FooXRef_Default] DEFAULT(1)
);

存在的规则可以在BarIDDefaultRecord = 0中存在具有相同值的无限数量的记录,但是只有一个记录可以存在,其中BarID在表中,并且DefaultRecord = 1
我需要设置什么类型的约束才能允许这种组合?
在当前数据库中,执行此组合的表结构和触发器是400,在下一个数据库中,我将以千为单位执行此组合。难道不可能设置一个约束来解决这个问题吗?

最佳答案

这里有一个不使用触发器的可能变体。
使用过滤条件在(BarID, DefaultRecord)上创建过滤的唯一索引。
有了这样的索引,每个WHERE ([DefaultRecord]=(1))只能插入一行BarID
可能有零行DefaultRecord = 1
可以有任何数量的行具有DefaultRecord = 1

CREATE UNIQUE NONCLUSTERED INDEX [IX_DefaultRecord] ON [dbo].[FooXRef]
(
    [BarID] ASC,
    [DefaultRecord] ASC
)
WHERE ([DefaultRecord]=(1))

08-28 06:41