ALTER TRIGGER [RelationDeleteTrigger]
ON [dbo].[t_containment]
FOR DELETE
AS
Declare @ObjCursor cursor
Declare @ParentID int Set @ObjCursor = Cursor For
select DISTINCT [ParentId] from deleted Open @ObjCursor FETCH NEXT FROM @ObjCursor INTO @ParentID while( @@FETCH_STATUS = 0 )
Begin
exec RefreshTotalData @ParentID FETCH NEXT FROM @ObjCursor INTO @ParentID
End close @ObjCursor
deallocate @ObjCursor

解决方案 »

  1.   

    表t_containment删除数据时,对于删除的数据中不同的ParentId 执行函数(存储过程)RefreshTotalData
      

  2.   

    --修改触发器语句,触发器名字为 [RelationDeleteTrigger]
    ALTER TRIGGER [RelationDeleteTrigger]
    建立触发器的表
    ON [dbo].[t_containment]
    删除触发器
    FOR DELETE
    AS
    定义游标变量
    Declare @ObjCursor cursor
    定义一个整型变量
    Declare @ParentID int
    从表deleted里给游标变量赋值
    Set @ObjCursor = Cursor For
    select DISTINCT [ParentId] from deleted
    打开游标
    Open @ObjCursor
    把deleted第一行的记录赋给游标变量
    FETCH NEXT FROM @ObjCursor INTO @ParentID
    判断游标状态,状态一共有三种0:有记录,还有-1,-2
    while( @@FETCH_STATUS = 0 )
    Begin
    循环执行存储过程
    exec RefreshTotalData @ParentID
    获取下一个游标变量赋给变量@ParentID,再次进行游标判断
    FETCH NEXT FROM @ObjCursor INTO @ParentID
    End
    关闭游标
    close @ObjCursor
    删除游标
    deallocate @ObjCursor
      

  3.   

    你对表[dbo].[t_containment]进行删除操作的时候,他会自动执行,不用人操心~
      

  4.   

    噢,那就是说在程序中不用处理,只在库里添加Trigger后,会自动执行是吗?
      

  5.   

    是的,只是在删除的时候执行,插入或更新的时候,不起作用。
    因为触发器有三种:
    delete,insert,update
    你的属于第一种~
      

  6.   

    恩,知道了,谢谢你们
    最上面还有
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    这二句是什么意思
      

  7.   

    SET ANSI_NULLS
    指定在对空值使用等于 (=) 和不等于 (<>) 比较运算符时,这些运算符的 SQL-92 遵从行为。语法
    SET ANSI_NULLS {ON | OFF}注释
    SQL-92 标准要求对空值的等于 (=) 或不等于 (<>) 比较取值为 FALSE。当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。
      

  8.   

    SET QUOTED_IDENTIFIER
    使 Microsoft&reg; SQL Server&#8482; 遵从关于引号分隔标识符和文字字符串的 SQL-92 规则。由双引号分隔的标识符可以是 Transact-SQL 保留关键字,或者可以包含 Transact-SQL 标识符语法规则通常不允许的字符。语法
    SET QUOTED_IDENTIFIER { ON | OFF }注释
    当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有 Transact-SQL 标识符规则。有关更多信息,请参见使用标识符。文字可以由单引号或双引号分隔。当 SET QUOTED_IDENTIFIER 为 ON 时,由双引号分隔的所有字符串都被解释为对象标识符。因此,加引号的标识符不必遵守 Transact-SQL 标识符规则。它们可以是保留关键字,并且可以包含 Transact-SQL 标识符中通常不允许的字符。不能使用双引号分隔文字字符串表达式,而必须用单引号括住文字字符串。如果单引号 (') 是文字字符串的一部分,则可以由两个单引号 ('') 表示。当对数据库中的对象名使用保留关键字时,SET QUOTED_IDENTIFIER 必须为 ON。当 SET QUOTED_IDENTIFIER 为 OFF(默认值)时,表达式中的文字字符串可以由单引号或双引号分隔。如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。当在计算列或索引视图上创建或操作索引时,SET QUOTED_IDENTIFIER 必须为 ON。如果 SET QUOTED_IDENTIFIER 为 OFF,则计算列或索引视图上带索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。有关计算列上的索引视图和索引所必需的 SET 选项设置的更多信息,请参见 SET 中的"使用 SET 语句时的注意事项"。在进行连接时,SQL Server ODBC 驱动程序和用于 SQL Server 的 Microsoft OLE DB 提供程序自动将 QUOTED_IDENTIFIER 设置为 ON。这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。对来自 DB-Library 应用程序的连接,SET QUOTED_IDENTIFIER 设置默认为 OFF。当创建存储过程时,将捕获 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置,用于该存储过程的后续调用。当在存储过程内执行 SET QUOTED_IDENTIFIER 时,其设置不更改。当 SET ANSI_DEFAULTS 为 ON时,将启用 SET QUOTED_IDENTIFIER。
      

  9.   

    从表deleted里给游标变量赋值
    Set @ObjCursor = Cursor For
    select DISTINCT [ParentId] from deleted
     这里的deleted是指当前的触发器表是吗?
      

  10.   

    SQL联机帮助里都有,你看看就明白了~
      

  11.   

    进行删除操作后系统自动生成的虚拟表
    同样,进行更新或是插入的时候,也会生成一个inserted表