在我目前的位置上,我遇到了一个需要分配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)
);
存在的规则可以在
BarID
和DefaultRecord = 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))