触发器/程序有帮助

时间:2010-11-19 14:52:15

标签: sql transactions triggers

create table  student
(spnr   VARCHAR(5)  PRIMARY KEY,
sname   VARCHAR(10),
saddress    VARCHAR(10),
stel    VARCHAR(10) )

create table course
    (ccode  VARCHAR(5)  PRIMARY KEY,
    cname   VARCHAR(10),
    caddress    VARCHAR(10),
    points  int )

create table studies
    (id     int     PRIMARY KEY,
     spnr   VARCHAR(5)  NOT NULL,
     ccode  VARCHAR(5)  NOT NULL,
     result int,    
    CONSTRAINT STUDIES_SPNR_FK FOREIGN KEY(spnr) REFERENCES student(spnr),
    CONSTRAINT STUDIES_CCODE_FK FOREIGN KEY(ccode) REFERENCES course(ccode) )

create trigger t1  on  course
after update,insert
as
    print 'inside trigger';
    select i.ccode from inserted i, deleted d
    where i. ccode = d. ccode

create procedure what (@tableName varchar(10))
as 
begin

    declare @name varchar(20);

    declare c cursor for 
    select column_name 
    from information_schema.columns
    where table_name = @tableName;
    open c;
    fetch c into @name;
    while @@fetch_status = 0 begin
        print 'name:' + @name;
        fetch c into @name;
    end

    close c;
    deallocate c;
end;

运行时:

begin transaction
insert into course values('K1','data1','lund',5);
update course
set cname ='informatik';
commit

显示以下消息:

   inside trigger

(0 row(s) affected)

(1 row(s) affected)
inside trigger

(1 row(s) affected)

(1 row(s) affected)

最后,为什么1行受影响最终显示2次?当它只在一个位置将cname更改为“informatic”时?

1 个答案:

答案 0 :(得分:1)

一个“1行受影响”来自UPDATE,一个来自SELECT中的触发器。尝试从触发器中删除SELECT,您应该只看到一个“1行受影响”。