2012-10-30 199 views
1

亲爱的我都遇到了触发器的问题。插入更新删除触发器

我在做这件事,现在只适用于插入。如果你有时间,我认为我很亲密,请帮助我。我试图通过触发器将所有插入,更新和删除存储到表customers_changelog中。代码有问题,我不能删除或更新客户,我只能插入新的客户。请帮助我,我已经花了很多时间在这个,只是不能得到这个工作! :)

create table customers (
customerid int identity primary key, 
name varchar(100) not null, 
address varchar(100) 
) 
go 

create table customers_changelog (
customerid int, 
name varchar(100) not null, 
address varchar(100), 
change_user varchar(32), 
change_time datetime, 
change_action char(1) default 'I', 
check (change_action = 'I' or change_action = 'D') 
) 
go 


CREATE TRIGGER log_changes 
ON customers 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

-- 
-- Check if this is an INSERT, UPDATE or DELETE Action. 
-- 
DECLARE @customerid1 as int; 
DEClARE @name1 as varchar(32); 
DECLARE @address1 as varchar(100); 
DECLARE @change_action1 as char(1); 
DECLARE @change_time1 as datetime; 
DECLARE @change_user1 as varchar(32); 

select @customerid1 = c.customerid, @name1 = c.name, @address1 = c.address 
from customers c, inserted i 
where c.customerid = i.customerid 

SET @change_time1 = CURRENT_TIMESTAMP; 
SET @change_user1 = CURRENT_USER; 
INSERT INTO customers_changelog(customerid,name,address,change_action,change_time,change_user) 
    VALUES(@customerid1,@name1,@address1,'I',@change_time1,@change_user1) 
IF EXISTS(SELECT * FROM DELETED) 
BEGIN  
      IF EXISTS(SELECT * FROM INSERTED) 
      INSERT INTO customers_changelog VALUES(@customerid1,@name1,@address1,'U',@change_time1,@change_user1) 
      ELSE 
      INSERT INTO customers_changelog VALUES(@customerid1,@name1,@address1,'D',@change_time1,@change_user1) 

END 
ELSE 
    IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; 
END 
+1

*** *** SQL只是*结构化查询语言* - 许多数据库系统中使用的语言,但没有AA数据库产品...触发器是**高度**供应商特定的 - 所以我们真的需要知道你正在使用的数据库系统**(和哪个版本)...... –

回答

0

假设MS-SQL语法从 - 所以夫妇的问题在这里:
1.需要在“更新”中指定列列表和“删除”,因为插入表中列的顺序不匹配你的插入。
2.不能使用“插入”数据删除插入

ALTER TRIGGER [dbo].[log_changes] ON [dbo].[customers] AFTER INSERT, UPDATE, DELETE AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @customerid1 as int; 
    DEClARE @name1 as varchar(32); 
    DECLARE @address1 as varchar(100); 
    DECLARE @change_action1 as char(1); 
    DECLARE @change_time1 as datetime; 
    DECLARE @change_user1 as varchar(32); 

    select @customerid1 = c.customerid, @name1 = c.name, @address1 = c.address 
    from customers c, inserted i 
    where c.customerid = i.customerid 

    SET @change_time1 = CURRENT_TIMESTAMP; 
    SET @change_user1 = CURRENT_USER; 

    IF EXISTS(SELECT * FROM DELETED) 
    BEGIN  
       IF EXISTS(SELECT * FROM INSERTED) 
       INSERT INTO customers_changelog(customerid,name,address,change_action,change_time,change_user) 
        VALUES(@customerid1,@name1,@address1,'U',@change_time1,@change_user1) 
       ELSE 
       BEGIN 
        select @customerid1 = d.customerid, @name1 = d.name, @address1 = d.address 
         from deleted d 
        INSERT INTO customers_changelog(customerid,name,address,change_action,change_time,change_user) 
         VALUES(@customerid1,@name1,@address1,'D',@change_time1,@change_user1) 
       END 

    END 
    ELSE 
    BEGIN 
     IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; 
     INSERT INTO customers_changelog(customerid,name,address,change_action,change_time,change_user) 
      VALUES(@customerid1,@name1,@address1,'I',@change_time1,@change_user1) 
    END 
END 
+0

谢谢你的迅捷答案解决了我的问题!非常感谢! – Akkadak1234

+0

我有同样的问题有人可以帮助我。看到下面的链接http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26043654#26043654 – Prathyush

+0

它不适合我显示,语法错误...... –