2011-05-26 126 views
1

儘管完成後它已成功完成,但沒有進行所需的更新。觸發器沒有更新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 

有沒有我做錯了或者我不能在觸發器範圍內使用變量?

非常感謝

回答

1

其他人已經正確回答你應該使用inserted和一個連接來構建正確的觸發器。但是:

根據您對其他答案的評論 - 您不應該嘗試從觸發器訪問自己的數據庫之外的任何資源,讓其他服務器放手。

嘗試將觸發器活動與跨服務器活動分離 - 比如讓觸發器向隊列表中添加一行(或使用真實服務代理隊列),並讓獨立組件負責處理這些請求。

否則,如果有任何例如網絡問題,不僅會觸發您的觸發器,而且會強制回滾原始更新 - 這會使您的本地數據庫無法使用。

這也意味着,獨立成分可以與超時處理,並執行重試適當等

+0

是的,不是最理想的情況。非常感謝您對我可能遇到的問題的額外意見。 – Node17 2011-05-26 14:30:24

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服務器,其被插入/修改或刪除的記錄佔有自己在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

2

爲了處理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

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 

如果表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

1

下面線應被刪除

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

應該是以下。

SELECT Issue_Id FROM Inserted