当表中有主外键是的触发器问题
CREATE TABLE stduent (
ID int IDENTITY (100, 1) NOT NULL ,
S_Cod char (10) NOT NULL PRIMARY KEY ,
S_Name char (10) NOT NULL ,
S_Sex char (2) NULL DEFAULT ( '男 ') ,
S_Age tinyint NULL CHECK(S_Age BETWEEN 16 AND 35),
S_Spe char (20) NOT NULL
)
CREATE TABLE Sa_curriculum (
ID int IDENTITY (10, 1) NOT NULL ,
S_Cod char (10) NOT NULL FOREIGN KEY REFERENCES stduent(S_Cod) ,
C_Cod char (10) NOT NULL ,
Sa_Ach smallint NOT NULL,
CONSTRAINT FK_Sa_C_Dod FOREIGN KEY(C_Cod) REFERENCES courses(C_Cod)
)
现在我想建立一个UPDATE触发器,当更新stduent中的S_Cod 的时候 同时更新Sa_curriculum 中的S_Cod 小弟我试了很长的时间都无法作出来,问老师 ,老师说在有主外键的时候 不好做UPDATE触发器--言外知音就是做不出来哦,先请各位高手指点哈。
------解决方案--------------------老师说在有主外键的时候 不好做UPDATE触发器
估计老师的意思是,在设置了级联更新和级联删除的时候,做update触发器是不能做的。
如果没有设置级联更新和级联删除的时候,用触发器肯定是可以的。
create trigger tr_talbeu
update
as
update Sa_curriculum set s_cod = (select s_cod from inserted)
where s_cod = (select s_code from stduent where id = (select id from inserted))
试下呢。我怕写错语法了^_^
------解决方案--------------------触发器通常是用来检查一些复杂的业务逻辑,或者进行数据的安全检查的,建议楼主可以在这些地方是用触发器。
最典型的触发器用法是根据另外一张表的内容,来判断本表的数据修改是否正确,当然如果能使用外键约束完成检查是最好不过的了。
------解决方案--------------------如果一定要用触发器来更新的话,不能用after触发器来更新,应该使用instead of触发器尝试一下。因为SQL SERVER事务执行的顺序是,先执行instead of触发器,然后检查表存在的约束,最后执行after触发器。楼主可以想办法用instead of触发器进行你的工作。不过,我个人觉得表的定义的约束时没有办法绕开的,所以这种方法也不见得可行。
说明:SQL SERVER 2000一下版本不支持instead of触发器