【www.gdgbn.com--php与数据库】

sql 创建触发器再获取刚插入的值

create   trigger   [t1_test]   on   [dbo].[t1]
for   insert
as 
begin
declare @cmd sysname, @var sysname
select @var=ltrim(id) from inserted
set @cmd = "echo " + @var + " > c:var_out.txt"
 exec   master..xp_cmdshell @cmd
end
create trigger afterdeleteteacher(触发器名称)
  on teacher(触发器对应的表名)
  after delete,update(在表发生何种操作时候触发,这里是delete,update之后触发)
as 
begin
  //触发之后的具体操作
  if update(course_name)//如果course_name字段更新
  bedin
  //对表lesson的相关操作语句
  end
  //删除操作
  delete from lesson where course_name=(select course_name from deleted)
end

再看个简单实例

create trigger trigger_course_name
on teacher
for update
as
if update(course_name)
 update lesson set course_name=(select courses_name from inserted) [color=#ff0000]where course_name=(select courses_name from deleted)[/color]

 

关于mssql触发器说明

create   trigger   trigger_name  
on   {   table   |   view   }  
[   with   encryption   ]  
{
        {   {   for   |   after   |   instead   of   }   {   [   insert   ]   [   ,   ]   [   update   ]   }
                [   with   append   ]
                [   not   for   replication   ]
                as
                [   {   if   update   (   column   )
                        [   {   and   |   or   }   update   (   column   )   ]
                                [   ...n   ]
                |   if   (   columns_updated   (   )   {   bitwise_operator   }   updated_bitmask   )
                                {   comparison_operator   }   column_bitmask   [   ...n   ]
                }   ]  
                sql_statement   [   ...n   ]  
        }  
}  

参数
trigger_name

是触发器的名称。触发器名称必须符合标识符规则,并且在数据库教程中必须唯一。可以选择是否指定触发器所有者名称。

table   |   view

是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。

with   encryption

加密   syscomments   表中包含   create   trigger   语句文本的条目。使用   with   encryption   可防止将触发器作为   sql   server   复制的一部分发布。

after

指定触发器只有在触发   sql   语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定   for   关键字,则   after   是默认设置。

不能在视图上定义   after   触发器。

instead   of

指定执行触发器而不是执行触发   sql   语句,从而替代触发语句的操作。

在表或视图上,每个   insert、update   或   delete   语句最多可以定义一个   instead   of   触发器。然而,可以在每个具有   instead   of   触发器的视图上定义视图。

instead   of   触发器不能在   with   check   option   的可更新视图上定义。如果向指定了   with   check   option   选项的可更新视图添加   instead   of   触发器,sql   server   将产生一个错误。用户必须用   alter   view   删除该选项后才能定义   instead   of   触发器。

{   [delete]   [,]   [insert]   [,]   [update]   }

是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。

对于   instead   of   触发器,不允许在具有   on   delete   级联操作引用关系的表上使用   delete   选项。同样,也不允许在具有   on   update   级联操作引用关系的表上使用   update   选项。   

with   append

指定应该添加现有类型的其它触发器。只有当兼容级别是   65   或更低时,才需要使用该可选子句。如果兼容级别是   70   或更高,则不必使用   with   append   子句添加现有类型的其它触发器(这是兼容级别设置为   70   或更高的   create   trigger   的默认行为)。有关更多信息,请参见   sp_dbcmptlevel。

with   append   不能与   instead   of   触发器一起使用,或者,如果显式声明   after   触发器,也不能使用该子句。只有当出于向后兼容而指定   for   时(没有   instead   of   或   after),才能使用   with   append。以后的版本将不支持   with   append   和   for(将被解释为   after)。

not   for   replication

表示当复制进程更改触发器所涉及的表时,不应执行该触发器。

as

是触发器要执行的操作。

sql_statement

是触发器的条件和操作。触发器条件指定其它准则,以确定   delete、insert   或   update   语句是否导致执行触发器操作。

当尝试   delete、insert   或   update   操作时,transact-sql语句中指定的触发器操作将生效。

触发器可以包含任意数量和种类的   transact-sql   语句。触发器旨在根据数据修改语句检查或更改数据;它不应将数据返回给用户。触发器中的   transact-sql   语句常常包含控制流语言。create   trigger   语句中使用几个特殊的表:  

deleted   和   inserted   是逻辑(概念)表。这些表在结构上类似于定义触发器的表(也就是在其中尝试用户操作的表);这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索   deleted   表中的所有值,请使用:  
select   *
from   deleted

如果兼容级别等于   70,那么在   delete、insert   或   update   触发器中,sql   server   将不允许引用   inserted   和   deleted   表中的   text、ntext   或   image   列。不能访问   inserted   和   deleted   表中的   text、ntext   和   image   值。若要在   insert   或   update   触发器中检索新值,请将   inserted   表与原始更新表联接。当兼容级别是   65   或更低时,对   inserted   或   deleted   表中允许空值的text、ntext   或   image   列,将返回空值;如果这些列不可为空,则返回零长度字符串。  
当兼容级别是   80   或更高时,sql   server   允许在表或视图上通过   instead   of   触发器更新   text、ntext   或   image   列。

n

是表示触发器中可以包含多条   transact-sql   语句的占位符。对于   if   update   (column)   语句,可以通过重复   update   (column)   子句包含多列。

if   update   (column)

测试在指定的列上进行的   insert   或   update   操作,不能用于   delete   操作。可以指定多列。因为在   on   子句中指定了表名,所以在   if   update   子句中的列名前不要包含表名。若要测试在多个列上进行的   insert   或   update   操作,请在第一个操作后指定单独的   update(column)   子句。在   insert   操作中   if   update   将返回   true   值,因为这些列插入了显式值或隐性   (null)   值。


说明     if   update   (column)   子句的功能等同于   if、if...else   或   while   语句,并且可以使用   begin...end   语句块。有关更多信息,请参见控制流语言。  


可以在触发器主体中的任意位置使用   update   (column)。

column

是要测试   insert   或   update   操作的列名。该列可以是   sql   server   支持的任何数据类型。但是,计算列不能用于该环境中。有关更多信息,请参见数据类型。  

if   (columns_updated())  

测试是否插入或更新了提及的列,仅用于   insert   或   update   触发器中。columns_updated   返回   varbinary   位模式,表示插入或更新了表中的哪些列。

columns_updated   函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含   8   列以上,则   columns_updated   返回多个字节,最左边的为最不重要的字节。在   insert   操作中   columns_updated   将对所有列返回   true   值,因为这些列插入了显式值或隐性   (null)   值。

可以在触发器主体中的任意位置使用   columns_updated。

bitwise_operator

是用于比较运算的位运算符。

updated_bitmask

是整型位掩码,表示实际更新或插入的列。例如,表   t1   包含列   c1、c2、c3、c4   和   c5。假定表   t1   上有   update   触发器,若要检查列   c2、c3   和   c4   是否都有更新,指定值   14;若要检查是否只有列   c2   有更新,指定值   2。

comparison_operator

是比较运算符。使用等号   (=)   检查   updated_bitmask   中指定的所有列是否都实际进行了更新。使用大于号   (> )   检查   updated_bitmask   中指定的任一列或某些列是否已更新。

column_bitmask

本文来源:http://www.gdgbn.com/jiaocheng/25500/