问题描述
|
尽管此操作在完成时已成功完成,但是没有所需的更新。
创建触发触发器1
在dbo上。[table1]
更新
如
声明@Id int;
SELECT @Id =来自dbo的Issue_Id。[表1]
插入dbo。[存储]
选择ID,标题,项目,问题
来自dbo。[table2]
ID = @Id
我做错了什么,还是不能在触发器范围内使用变量?
非常感谢
解决方法
其他人都正确回答了您应该使用
inserted
和一个连接来建立适当的触发器。但:
根据您对他人答案的评论,您永远不要尝试从触发器访问您自己数据库之外的任何资源,而要从另一台服务器访问。
尝试使触发器活动与跨服务器活动脱钩-说让您的触发器在队列表中添加一行(或使用真实服务代理队列),并由一个独立的组件负责服务这些请求。
否则,如果有网络问题,不仅触发会中断,而且还会强制回滚原始更新,这会使您的本地数据库无法使用。
这也意味着独立组件可以应对超时,并执行适当的重试等。
,支持多行更新
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
,一次性处理多个更新和inserted
表:
CREATE TRIGGER Trigger1
On dbo.[table1]
FOR UPDATE
AS
INSERT INTO dbo.[storage]
SELECT Id,Problem
FROM dbo.[table2] t2
JOIN Inserted i ON i.Issue_ID = t2.Id
,请通过以下建议。
代替下面的行
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,Problem
FROM dbo.[table2]
Inner Join CTE c on c.Issue_Id = Id
了解更多信息
在SQL Server中,要插入/修改或删除的记录自己占据在DML触发器中可用的两个临时表中。这些表已插入和删除。 INSERTED表已插入或更新了记录。 DELETED表具有正在更新或删除的记录的旧状态。
,下面的行应删除
SELECT @Id =来自dbo的Issue_Id。[表1]
应该跟随。
SELECT Issue_Id FROM已插入