触发不更新sql

时间:2011-05-26 10:20:13

标签: sql-server triggers

尽管在完成时已成功完成,但它没有进行所需的更新。

CREATE TRIGGER Trigger1
On dbo.[table1] 
FOR UPDATE
AS
Declare @Id int;
SELECT @Id = Issue_Id FROM dbo.[table1]

INSERT INTO dbo.[storage]
    SELECT Id, Title, project, Problem
    FROM dbo.[table2]
    WHERE Id = @Id

我做错了什么或者我不能在触发器范围内使用变量?

非常感谢

5 个答案:

答案 0 :(得分:4)

支持多行更新

CREATE TRIGGER Trigger1 On dbo.[table1] FOR UPDATE
AS
SET NOCOUNT ON

INSERT INTO dbo.[storage]
    SELECT t.Id, t.Title, t.project, t.Problem
    FROM dbo.[table2] t
        JOIN INSERTED I ON t.ID = I.ID
GO

如果table2实际上是table1(更有意义:table1storagetable2的关系如何?)...

CREATE TRIGGER Trigger1 On dbo.[table1] FOR UPDATE
AS
SET NOCOUNT ON

INSERT INTO dbo.[storage]
    SELECT Id, Title, project, Problem
    FROM INSERTED
GO

答案 1 :(得分:2)

请仔细阅读以下建议。

而不是下面的行

SELECT @Id = Issue_Id FROM dbo.[table1]

必须遵循。

SELECT Issue_Id FROM Inserted

以下是更新后的内容。

CREATE TRIGGER Trigger1
On dbo.[table1] 
FOR UPDATE
AS
SET NOCOUNT ON
Declare @Id int;

With CTE as 
(
    SELECT Issue_Id FROM Inserted I
    Inner Join [table1] T on T.Issue_Id  = I.Issue_Id
)

INSERT INTO dbo.[storage]
SELECT Id, Title, project, Problem
FROM dbo.[table2]
Inner Join CTE c on c.Issue_Id = Id

了解更多信息

在SQL Server中,正在插入/修改或删除的记录占用DML触发器中可用的两个临时表。这些表是INSERTED和DELETED。 INSERTED表已插入或更新记录。 DELETED表具有更新或删除的旧记录状态。

答案 2 :(得分:2)

一次性处理多个更新和inserted表:

CREATE TRIGGER Trigger1
On dbo.[table1] 
FOR UPDATE
AS

INSERT INTO dbo.[storage]
    SELECT Id, Title, project, Problem
    FROM dbo.[table2] t2
         JOIN Inserted i ON i.Issue_ID = t2.Id

答案 3 :(得分:1)

其他人已正确回答您应该使用inserted和联接来构建正确的触发器。但是:

根据您对其他答案的评论 - 您绝不应尝试从触发器访问您自己数据库之外的任何资源,而是从另一台服务器访问。

尝试将触发器活动与跨服务器活动分离 - 比如让您的触发器向队列表添加一行(或使用真实服务代理队列),并让独立组件负责为这些请求提供服务。

否则,如果有任何例如网络问题,您的触发器不仅会中断,而且还会强制原始更新的回滚 - 它会使您的本地数据库无法使用。

这也意味着独立组件可以应对超时,并执行适当的重试等。

答案 4 :(得分:1)

下面的行应该删除

SELECT @Id = Issue_Id FROM dbo。[table1]

应该遵循。

SELECT Issue_Id FROM Inserted