2010-07-26 46 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