我的数据库中有一个业务规则,说明ID必须与特定ID列表匹配才能生效。我不能在这个实例中使用CHECK约束,因为它需要子查询来查找有效的ID,因此我需要使用触发器。
简单地说,为了将记录插入表A中。表A中的ID字段(数字)必须存在于表B或C中。
然而,我可以使用标量UDF来检查ID是否有效,但这看起来有点像函数滥用。我已经在我的数据库中完成了几次这样的操作,虽然它有效,但它看起来很错误。
回到触发器,我无法确定在这种情况下我需要使用哪个触发器,因为它们似乎都可以工作,除了在不同阶段捕获错误。
使用INSTEAD OF触发器会在插入/更新之前捕获无效ID,但此触发器的代码似乎有点过于复杂。 (需要12个变量和一个长期难以处理的INSERT语句)
AFTER触发器将执行相同的任务,但插入行后会捕获错误,然后回滚操作。
尽管所有这三种方法都有效,但其中一种方法必须更加合适。为了这个任务?
答案 0 :(得分:1)
您可以使用用户定义函数并将验证码封装在其中。看起来应该是这样的。
-- Create Dummy Table
CREATE TABLE Employee
( ID INT, Name VARCHAR(50), Age TINYINT)
GO
-- Function to verify age of employee
CREATE FUNCTION dbo.verifyAge
( @Age TINYINT)
RETURNS BIT
BEGIN
IF (@Age IS NULL OR @Age >= 18)
RETURN 1
RETURN 0;
END;
-- Add check constraint
ALTER TABLE dbo.Employee
ADD CONSTRAINT Chk_verifyAge CHECK (dbo.verifyAge(Age) = 1)
GO
-- Test check Constraint
INSERT INTO dbo.Employee
( ID, Name, Age )
VALUES ( 1, 'Dummy',17)
GO