2010-07-26 43 views
2

我想編寫觸發器以使用插入和刪除的表格。我寫了觸發器插入:在觸發器中使用插入和刪除的表格

CREATE TRIGGER FILL_TABLE 
ON Person FOR INSERT 
AS 
DECLARE @ID int 
SELECT @ID = p.ID 
FROM Person AS p 
    INNER JOIN inserted AS i ON p.ID = i.ID 
DECLARE @uName char(30); 
SELECT @uName = SYSTEM_USER 
INSERT tblOperationLog 
Values 
(@uName, 'user has inserted a row with ID = ' + CONVERT(nvarchar, @ID) + '', 
    'Insert', CURRENT_TIMESTAMP, GETDATE()) 

我想編寫觸發器並使用刪除的表,就像插入的那樣。但我不知道如何。我想檢索已刪除的行的ID來填充tblOperationLog的第二列,但我不能。我是否也應該使用內連接?

+2

什麼是sql引擎? – 2010-07-26 15:31:08

+0

我使用SQL Server – anna 2010-07-26 15:36:10

回答

4

在SQL服務器中,觸發器可以訪問兩個邏輯表INSERTEDDELETED,它們與觸發器定義的表具有相同的結構。

這兩個表格都將在UPDATE觸發器上填充。一個INSERT觸發器將只填充INSERTED表,一個DELETE觸發器將只填充DELETED表。

請參閱MSDN

12

只有插入一行時,您的觸發器纔會起作用。由於inserted可作爲表格使用,因此可以從該表格插入並使用所有記錄。我認爲你正在尋找這樣的事情:

CREATE TRIGGER FILL_TABLE 
ON Person FOR INSERT, DELETE 
AS 

    INSERT tblOperationLog 
    SELECT SYSTEM_USER,'user has inserted a row with ID = ' + ID, 'Insert', 
    CURRENT_TIMESTAMP, getdate() 
    FROM inserted 

    INSERT tblOperationLog 
    SELECT SYSTEM_USER,'user has deleted a row with ID = ' + ID, 'Delete', 
    CURRENT_TIMESTAMP, getdate() 
    FROM deleted 
+0

非常感謝。我會測試它 – anna 2010-07-26 15:39:34

+0

是否有更新行的任何表?我是否也可以像上面一樣使用它? – anna 2010-07-26 15:42:03

+0

@anna - 根據@ Oded的回答,當執行更新時,行與舊信息一起位於已刪除的表中,並且插入的表格中包含新信息 – cjk 2010-07-26 15:43:35