SQL Server 2012外键约束触发器

时间:2016-02-22 21:53:44

标签: sql-server database triggers

我是触发器的新手,我创建了一个触发器来检查不同数据库中的表之间的外键约束。我知道不应该这样做,但是这是解决我的外键约束问题的唯一解决方案。触发器确实有效,但是当插入脚本有多个要插入的记录时,它不会告诉我哪个记录导致了违规。我正在寻找一种方法,触发器可以告诉我记录与' x'主键和' y'外键是失败的。目前,它运行通过脚本遇到违规,抛出RAISERROR,回滚一切,没有任何东西插入数据库。以下是我的脚本 -

Create Trigger AV.fkConstraintTrigger ON [AQB_MON].[AV].[NAAQValue]
    FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;

IF EXISTS (
    SELECT *
    FROM INSERTED AS I
    WHERE NOT EXISTS (
        SELECT *
        FROM [AVData].[dbo].[SourceParameterTemplate] AS A
        WHERE I.[SourceParameterTemplateID] = A.[SourceParameterTemplateID]
    )
)
BEGIN
    RAISERROR('Violation of foreign key constraint',16,1);
    ROLLBACK;
END

END

更新 我根据下面的注释对脚本进行了更改,因为我宁愿将它们显示在消息中,然后显示在单独的表中。但是,当我这样做时,我会在'附近找到两个不正确的语法。错误。首先是' ='第二个是最后一个'。我看不出会导致什么。

Create Trigger AV.testfkTrigger ON [AQB_MON].[AV].[NAAQValue]
    FOR INSERT, UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    Declare @SourceParameterTemplateID varchar(25)
    IF EXISTS (
        SELECT TOP 1 @SourceParameterTemplateID = [SourceParameterTemplateID]
        FROM INSERTED AS I
        WHERE NOT EXISTS (
            SELECT *
            FROM [AVData].[dbo].[SourceParameterTemplate] AS A
            WHERE I.[SourceParameterTemplateID] = A.[SourceParameterTemplateID]
        )
        order by [SourceParameterTemplateID]
)
    BEGIN
        RAISERROR('Violation of foreign key constraint',16,1, @SourceParameterTemplateID);
        ROLLBACK;
   END
END

1 个答案:

答案 0 :(得分:1)

将数据放入错误消息中并不是很有用。更有意义的是创建和异常表来存储数据,可能还有任何其他有用的字段,例如问题的时间和发送坏数据的用户。 如果暂时将信息放入表变量中,则可以在回滚后插入异常表,因为表变量未回滚。

然后,如果插入/更新返回错误,您的应用程序可以查找表中的数据。