系统自带的一触发器
ALTER TRIGGER [AuxQty_PORequest]
            ON [dbo].[PORequestEntry]
FOR INSERT,UPDATE
AS
    SET NOCOUNT ON
    
    UPDATE E
       SET E.FQty = CAST(I.FAuxQty AS DECIMAL(28, 16)) * CAST((ISNULL(U.FCoefficient, 1) + ISNULL(U.FScale, 0)) AS DECIMAL(28, 16)),
           E.FPrice = I.FAuxPrice / (ISNULL(U.FCoefficient, 1) + ISNULL(U.FScale, 0))
      FROM PORequestEntry E
           INNER JOIN inserted I ON E.FInterID = I.FInterID AND E.FEntryID = I.FEntryID
           INNER JOIN t_MeasureUnit U ON U.FItemID = I.FUnitID
现在我还想加一触发器,
create trigger tmp on porequestentry
    for update
as
    delete from updated  where fentryselfp0132=1000
类似上面的意思,一个表能加两个触发器吗?,这个触发器应该怎么改写下,谢谢

解决方案 »

  1.   


    create trigger tri_update on tbl
    after update
    as
    declare @col1 varchar(10)
    declare @id varchar(10)--确定修改的列
    select @id=id,@col=col from inserted
    if @col='1000'
    delete from tbl where id=@id--就是这么一个思路,你修改的数据存在于临时表inserted中,只需去出来就是了
      

  2.   

    sp_settriggerorder 
    指定第一个或最后一个激发的、与表关联的   AFTER   触发器。在第一个和最后一个触发器之间激发的   AFTER   触发器将按未定义的顺序执行。 语法 
    sp_settriggerorder[@triggername   =   ]   'triggername ' 
            ,   [@order   =   ]   'value ' 
            ,   [@stmttype   =   ]   'statement_type '   参数 
    [@triggername   =]   'triggername ' 是将要设置或更改顺序的触发器的名称。triggername   的数据类型为   sysname。如果此名称与触发器不对应或此名称对应于   INSTEAD   OF   触发器,该过程将返回错误。 [@order   =]   'value ' 是新触发器顺序的设置。value   的数据类型为   varchar(10),可以是下列值中的任何一个。 
    重要     First   和   Last   触发器必须是两个不同的触发器。   
    值   描述   
    First   最先激发的触发器。   
    Last   最后激发的触发器。   
    None   以未定义的顺序激发的触发器。   
    [@stmttype   =   ]   'statement_type ' 指定哪条   SQL   语句激发触发器。statement_type   的数据类型为   varchar(10),可以是   INSERT、UPDATE   或   DELETE。只有在触发器已经定义为某种语句类型的触发器后,才能将其指派为该语句类型的   First   或   Last   触发器。例如,如果   TR1   定义为   INSERT   触发器,则可以将表   T1   上的   INSERT   触发器   TR1   指派为   First   触发器。如果将只定义为   INSERT   触发器的   TR1   设置为   UPDATE   语句的   First(或   Last)触发器,则   SQL   Server   将返回错误信息。有关更多信息,请参见注释部分。 返回代码值 
    0(成功)或   1(失败) 注释 
    单个表上的每个   INSERT、UPDATE   或   DELETE   语句只能有一个   First   和一个   Last   触发器。 如果在表上已定义了   First   触发器,则不能指派新触发器作为同一操作(INSERT、UPDATE   或   DELETE)的同一表的   First   触发器。此限制也适用于   Last   触发器。 作为   SQL   Server   复制的一部分,可在已发布表上指派   First   触发器;然而,如果与用户定义的触发器存在冲突,则必须在表发布之前将用户定义触发器的指派更改为   None。 如果   ALTER   TRIGGER   语句更改第一个或最后一个触发器,则除去最初在触发器上设置的   First   或   Last   特性,并且替换为   None。顺序值必须用   sp_settriggerorder   重新设置。 如果必须将同一触发器指派为多个语句类型的第一个或最后一个顺序,则必须为每个语句类型执行   sp_settriggerorder。而且,在可以将触发器指派为某个语句类型激发的   First   或   Last   触发器之前,必须先将其定义为该语句类型。   权限 
    触发器所有者以及在其上定义触发器的表所有者拥有   sp_settriggerorder   的执行许可权限。当前数据库中的   db_owner   和   db_ddladmin   角色成员以及   sysadmin   服务器角色成员可以执行该存储过程。 示例 
    sp_settriggerorder   @triggername=   'MyTrigger ',   @order= 'first ',   @stmttype   =   'UPDATE ' 
    --可以建多个的,但是需要制定执行顺序
      

  3.   

    create trigger tri_update on porequestentry
    after update
    as
    declare @did int
    declare @fid int
    declare @isnot int --确定修改的列
    select @did=finterid,@fid=fentryid,@isnot=fentryselfp0132 from inserted
    if @isnot='1000'
    delete from porequestentry where finterid=@did and fentryid=@fid触发器能创建,但是运行的时候报错了,insertd对象名无效,是不是两个有冲突呢
      

  4.   


    select @did=finterid,@fid=fentryid,@isnot=fentryselfp0132 from inserted……是inserted,而不是insertd是inserted啊?