我是触发器的新手,我创建了一个触发器来检查不同数据库中的表之间的外键约束。我知道不应该这样做,但是这是解决我的外键约束问题的唯一解决方案。触发器确实有效,但是当插入脚本有多个要插入的记录时,它不会告诉我哪个记录导致了违规。我正在寻找一种方法,触发器可以告诉我记录与' 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
答案 0 :(得分:1)
将数据放入错误消息中并不是很有用。更有意义的是创建和异常表来存储数据,可能还有任何其他有用的字段,例如问题的时间和发送坏数据的用户。 如果暂时将信息放入表变量中,则可以在回滚后插入异常表,因为表变量未回滚。
然后,如果插入/更新返回错误,您的应用程序可以查找表中的数据。