日期:2014-05-18  浏览次数:20478 次

当表中有主外键是的触发器问题
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触发器