在INSTEAD OF / AFTER触发器和UDF

时间:2016-10-09 00:19:45

标签: sql-server triggers user-defined-functions

我的数据库中有一个业务规则,说明ID必须与特定ID列表匹配才能生效。我不能在这个实例中使用CHECK约束,因为它需要子查询来查找有效的ID,因此我需要使用触发器。

简单地说,为了将记录插入表A中。表A中的ID字段(数字)必须存在于表B或C中。

然而,我可以使用标量UDF来检查ID是否有效,但这看起来有点像函数滥用。我已经在我的数据库中完成了几次这样的操作,虽然它有效,但它看起来很错误。

回到触发器,我无法确定在这种情况下我需要使用哪个触发器,因为它们似乎都可以工作,除了在不同阶段捕获错误。

使用INSTEAD OF触发器会在插入/更新之前捕获无效ID,但此触发器的代码似乎有点过于复杂。 (需要12个变量和一个长期难以处理的INSERT语句)

AFTER触发器将执行相同的任务,但插入行后会捕获错误,然后回滚操作。

尽管所有这三种方法都有效,但其中一种方法必须更加合适。为了这个任务?

1 个答案:

答案 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

enter image description here