在未正确执行的触发器中插入

时间:2015-03-05 18:25:56

标签: sql sql-server tsql

我有一个insert,update触发器,我只是想将变量值插入表中。这是一个field/variable nchar(100)

DECLARE @Name nchar(100)

SET @Name = LEFT((select top 1 ISNULL(Name, '') 
                  from   inserted 
                  inner join dbo.accounts on inserted.id = dbo.accounts.id_c), 25) 

BEGIN TRY
    INSERT INTO CRM.dbo.TestName (name) VALUES (@Name)
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE()
END CATCH;

查看跟踪,我看到TRY正在执行的每一行(SP:StmtStartingSP:StmtCompleted),但是当我检查表本身时,没有插入任何内容。

我如何确定发生这种情况的原因?

2 个答案:

答案 0 :(得分:0)

您可以在触发器中尝试以下语句。保留TRY/CATCH阻止,因为如果SQL Server尝试执行没有记录的INSERT INTO,则会抛出异常。

BEGIN TRY
  INSERT INTO [crm].[dbo].[TestName] ([Name])
  SELECT LEFT(ISNULL([Name], ''), 25)
  FROM [inserted]
  INNER JOIN [dbo].[accounts]
    ON ([dbo].[accounts].[id_c] = [inserted].[id]);
END TRY BEGIN CATCH
END CATCH;

您在例如 AFTER INSERTAFTER UPDATE中使用了什么触发器?如果您在AFTER INSERT中执行此操作,您是否希望accounts中的某些内容与inserted.id匹配。它似乎是一个主键,在插入记录之前accounts可能不应该存在。

答案 1 :(得分:0)

我终于弄明白我的触发器是如何失败的,但我不是100%的原因。我在触发器的下方有另一个插入语句到链接服务器表。 raiseerror命令帮我弄清楚插入语句出了什么问题,在我修复了那个错误之后,我的问题中的insert语句成功执行了。

我没有得到的是,即使明确地将插入放在BEGIN TRAN / COMMIT TRAN中,如果下一个插入不起作用,它仍然不会执行?这就是触发器的工作原理吗?