尽管在完成时已成功完成,但它没有进行所需的更新。
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
我做错了什么或者我不能在触发器范围内使用变量?
非常感谢
答案 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(更有意义: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 :(得分: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