触发器没有更新sql

触发器没有更新sql

问题描述:

尽管完成后它已成功完成,但没有进行所需的更新。触发器没有更新sql

 
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 

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

非常感谢

其他人已经正确回答你应该使用inserted和一个连接来构建正确的触发器。但是:

根据您对其他答案的评论 - 您不应该尝试从触发器访问自己的数据库之外的任何资源,让其他服务器放手。

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

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

这也意味着,独立成分可以与超时处理,并执行重试适当等

+0

是的,不是最理想的情况。非常感谢您对我可能遇到的问题的额外意见。 – Node17 2011-05-26 14:30:24

请仔细阅读下面的建议。

取而代之的是以下行

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服务器,其被插入/修改或删除的记录占有自己在DML触发器两个可用的临时表。这些表是INSERTED和DELETED。 INSERTED表已插入或更新记录。 DELETED表具有正在更新或删除记录的旧状态。

+0

这对于多行更新仍然不起作用。 'dbo。[table2]'需要'join'到'inserted'表上,而不是假设'Issue_Id'只是一个单一的值。 – 2011-05-26 10:25:14

+0

是的。实际上@ Node17正在根据特定的ID插入记录。 – Pankaj 2011-05-26 10:27:24

+0

如果在'已插入'中存在多行,Issue_ID集仍将失败 – 2011-05-26 10:29:02

为了处理multple更新和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 
+0

+1用于正确处理多行。 – 2011-05-26 10:29:43

+0

我试图避免连接,因为它是一个跨服务器查询,带有超时的主要问题。 – Node17 2011-05-26 10:33:27

+0

@ NOde17 - 跨服务器查询?在*触发器*中? EWWW。 – 2011-05-26 10:37:50

要支持多行更新

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 

如果表2实际上是表1(这使得更多的意义:如何table1有关storagetable2?)...

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

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

+1 SET'NOCOUNT ON' – 2011-05-26 10:29:55

+0

我在跨服务器查询时遇到了超时问题。因此,表1是我输入数据的内容,当输入issue_id时,我想要一个触发器从其他服务器选择与问题ID匹配的数据。然后,从另一台服务器中选择的信息将被插入另一台服务器的本地副本,以解决超时问题。 – Node17 2011-05-26 10:38:43

下面线应被删除

SELECT @Id = ISSUE_ID FROM DBO。[表1]

应该是以下。

SELECT Issue_Id FROM Inserted