使用用户定义函数的列约束(udf)

时间:2011-02-28 14:07:49

标签: sql sql-server

我有两张桌子 - EmpDetails& ChangeLog

EmpDetails存储员工的详细信息 - 它有ID, Name等。

ChangeLog用于记录对员工详细信息的更改 - 它有ID, DateOfChange, ChangeDescription等。

我想确保ChangeLog.IDEmpDetails.ID列中包含的值。

所以,我使用ChangeLog.ID列的用户定义函数设置 CHECK 约束(UDF检查ID中是否存在EmpDetails.ID

我的问题是 - 如果从ID删除特定的EmpDetails行,如果ID中有ChangeLog行,是否会引发错误?

情况似乎并非如此......我不明白为什么。

那么,我将如何获得这样的功能?我能想到的一种方法是在EmpDetails上为删除操作创建一个触发器。

上述问题的其他解决方案?

编辑 - 我试图指定一个外键关系。但是ChangeLog中的ID不是密钥,因为ChangeLog表可以包含多个相同ID的记录(我的意思是,员工可以多次更改其详细信息,因此在ChangeLog中,相同ID的记录将超过1条)。即使在这种情况下,我是否应该能够指定外键关系?

2 个答案:

答案 0 :(得分:3)

您所描述的是foreign key关系。执行它:

ALTER TABLE ChangeLog
    ADD CONSTRAINT FK_EmpDetailsId FOREIGN KEY (ID)
    REFERENCES EmpDetails (ID);
然后,SQL Server将为您维护关系,而不需要您的UDF。如果EmpDetails中的相应行不存在,则插入到ChangeLog将失败,如果ChangeLog中存在匹配的行,则从EmpDetails中删除将失败。

答案 1 :(得分:1)

ChangeLog表上的检查约束,而不是EmpDetails上的检查约束,因此当您修改EmpDetails时,它不会被检查。 SQL服务器不够智能,无法确定在更改其他表时要运行检查。

但是,如果您只想确保EmpDetails表中有一行,为什么不使用简单的参照完整性规则(例如外键)?