当前位置: 代码迷 >> Sql Server >> update 两个属性的时候如何写触发器
  详细解决方案

update 两个属性的时候如何写触发器

热度:57   发布时间:2016-04-24 10:13:38.0
update 两个属性的时候怎么写触发器?
具体情况是改变学生的班级,相应的班级就加减人数。但是我把专业(maj)和班级编号(clas)绑定在一起做了class表的主码,比如机械1201和光材1201是不同的班,但是我只把机械改成光材,不改变编号的时候班级人数就不能按照要求改了。。源代码是这样大家意会一下就好。。student 表里专业是smaj,班级编号是sclass.

create trigger upd_num on student
   for update
as 
 if   update(sclass) begin
 update class set stnum=stnum-1
 from deleted
 where (clas = deleted.sclass and maj = deleted.smaj)
 or (clas = deleted.sclass and not exists(select smaj from deleted) )
 or (maj = deleted.smaj and not exists(select sclass from deleted) )   
 update class set stnum=stnum+1 
 from inserted
 where (clas = inserted.sclass and maj = inserted.smaj)
 or (clas = inserted.sclass and not exists(select smaj from inserted) )
 or (maj = inserted.smaj and not exists(select sclass from inserted) )
 end
GO


还有触发器代码我是照搬书上然后改的,不知道as在这里干什么,go也不知道要不要,可以解释一下么?
------解决方案--------------------
这是触发器的语法,你可以看联机丛书上的例子:
CREATE TRIGGER [ schema_name . ]trigger_name 
ON { table 
------解决方案--------------------
 view } 
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR 
------解决方案--------------------
 AFTER 
------解决方案--------------------
 INSTEAD OF } 
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } 
[ WITH APPEND ] 
[ NOT FOR REPLICATION ] 
AS { sql_statement  [ ; ] [ ,...n ] 
------解决方案--------------------
 EXTERNAL NAME <method specifier [ ; ] > }

<dml_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]

<method_specifier> ::=
    assembly_name.class_name.method_name

Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)
CREATE TRIGGER trigger_name 
ON { ALL SERVER 
------解决方案--------------------
 DATABASE } 
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR 
------解决方案--------------------
 AFTER } { event_type 
------解决方案--------------------
 event_group } [ ,...n ]
AS { sql_statement  [ ; ] [ ,...n ] 
------解决方案--------------------
 EXTERNAL NAME < method specifier >  [ ; ] }

<ddl_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]

<method_specifier> ::=
    assembly_name.class_name.method_name

Trigger on a LOGON event (Logon Trigger)
CREATE TRIGGER trigger_name 
ON ALL SERVER 
[ WITH <logon_trigger_option> [ ,...n ] ]
{ FOR 
------解决方案--------------------
 AFTER } LOGON  
AS { sql_statement  [ ; ] [ ,...n ] 
------解决方案--------------------
 EXTERNAL NAME < method specifier >  [ ; ] }

<logon_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]

<method_specifier> ::=
    assembly_name.class_name.method_name
  相关解决方案