触发器没有更新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
和一个连接来构建正确的触发器。但是:
根据您对其他答案的评论 - 您不应该尝试从触发器访问自己的数据库之外的任何资源,让其他服务器放手。
尝试将触发器活动与跨服务器活动分离 - 比如让触发器向队列表中添加一行(或使用真实服务代理队列),并让独立组件负责处理这些请求。
否则,如果有任何例如网络问题,不仅会触发您的触发器,而且会强制回滚原始更新 - 这会使您的本地数据库无法使用。
这也意味着,独立成分可以与超时处理,并执行重试适当等
请仔细阅读下面的建议。
取而代之的是以下行
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表具有正在更新或删除记录的旧状态。
这对于多行更新仍然不起作用。 'dbo。[table2]'需要'join'到'inserted'表上,而不是假设'Issue_Id'只是一个单一的值。 – 2011-05-26 10:25:14
是的。实际上@ Node17正在根据特定的ID插入记录。 – Pankaj 2011-05-26 10:27:24
如果在'已插入'中存在多行,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
+1用于正确处理多行。 – 2011-05-26 10:29:43
我试图避免连接,因为它是一个跨服务器查询,带有超时的主要问题。 – Node17 2011-05-26 10:33:27
@ 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
有关storage
和table2
?)...
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 SET'NOCOUNT ON' – 2011-05-26 10:29:55
我在跨服务器查询时遇到了超时问题。因此,表1是我输入数据的内容,当输入issue_id时,我想要一个触发器从其他服务器选择与问题ID匹配的数据。然后,从另一台服务器中选择的信息将被插入另一台服务器的本地副本,以解决超时问题。 – Node17 2011-05-26 10:38:43
下面线应被删除
SELECT @Id = ISSUE_ID FROM DBO。[表1]
应该是以下。
SELECT Issue_Id FROM Inserted
是的,不是最理想的情况。非常感谢您对我可能遇到的问题的额外意见。 – Node17 2011-05-26 14:30:24