2012-05-31 22 views
0

我想在SQL Server 2008中为tblCustomer表创建数据库触发器。我需要它在tblCustomer表中每次插入,更新或删除时在tblChanges表中添加一个新行。为自定义创建数据库触发器ChangeTable

具体来说,我需要它插入已更改的CustomerId (PK),发生更改的dateTime以及更改类型(插入,更新,删除)。

我有东西沿着这些路线,但迄今为止想不通休息:

CREATE TRIGGER change_trigger 
AFTER INSERT OR UPDATE OR DELETE 
ON tblCustomer 

    DECLARE log_action varchar(30) 
BEGIN 

    IF INSERTING THEN 
     log_action := 'I'; 
    ELSEIF UPDATING THEN 
     log_action := 'U'; 
    ELSEIF DELETEING THEN 
     log_action := 'D'; 
    ELSE 
     DBMS_OUTPUT.PUT_LINE('undefined'); 
    END IF; 

    INSERT INTO tblChanges(ChanedPK, ChangedTime, ChangedType) 
    VALUES ... 

我不能确定,因为我还没有尝试运行任何上述SQL是正确的然而,我的SQL知识是有限的。任何帮助完成代码和纠正错误,将不胜感激。

回答

0

试试沿着这些线路:

CREATE TRIGGER change_trigger AFTER INSERT, UPDATE, DELETE 
ON tblCustomer 
AS 
BEGIN 
    DECLARE log_action varchar(30) 

    IF EXISTS (SELECT * FROM INSERTED) AND NOT EXISTS(SELECT * FROM DELETED) 
     SET log_action = 'INSERT' 

    IF EXISTS NOT (SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED) 
     SET log_action = 'DELETE' 

    IF EXISTS (SELECT * FROM INSERTED) AND EXISTS(SELECT * FROM DELETED) 
     SET log_action = 'UPDATE' 

    -- Your other code goes here 


END 

也许你应该阅读了联合国T-SQL DML和SQL Server中触发第一。 MSDN和其他许多网站提供了关于如何处理事情的绝佳示例。

+0

好吧,这工作正常,但我也需要它插入当前的日期和时间以及被改变的行的PK。任何帮助? –

+0

好吧,我得到了datetime罚款。它只是GETDATE()。但是我仍然无法找到pk –

+0

SQL Server通过两个名为“插入”和“删除”的虚拟表将更改公开给表。它们包含所有更改的数据。 – Mithrandir