表结构如下:
----------
A     B
---------
A值由用户输入
B值=2*A
B值的更新代码写在表的触发中
如果B值更新了,那么又会触发触发器中的代码,
这一样一来就不停的执行这个触发代码。
可是在事件跟踪中并没有看到无限制的执行代码啊

解决方案 »

  1.   

    建议lz改成insert触发器,即用户输入数据插入到表中时,触发事件。
    触发器中完成B=2*A的功能。
      

  2.   

    create trigger tri_a
    on table
    for insert
    as
    declare @aa varchar(20)
    select @aa=A from inserted
    uodate table 
    set B=2*@aa
    where A exists (select A from inserted)
      

  3.   

    触发器最多嵌套32层,且是可以设置为不嵌套触发的。
    使用嵌套触发器
    如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器……这些触发器就是嵌套触发器。触发器可嵌套至 32 层,并且可以控制是否可以通过"嵌套触发器"服务器配置选项进行触发器嵌套。如果允许使用嵌套触发器,且链中的一个触发器开始一个无限循环,则超出嵌套级,而且触发器将终止。可使用嵌套触发器执行一些有用的日常工作,如保存前一触发器所影响行的一个备份。例如,可以在 titleauthor 上创建一个触发器,以保存由 delcascadetrig 触发器所删除的 titleauthor 行的备份。在使用 delcascadetrig 时,从 titles 中删除title_id PS2091 将删除 titleauthor 中相应的一行或多行。要保存数据,可在 titleauthor 上创建 DELETE 触发器,该触发器的作用是将被删除的数据保存到另一个单独创建的名为 del_save 表中。例如:CREATE TRIGGER savedel
       ON titleauthor
    FOR DELETE
    AS
       INSERT del_save
       SELECT * FROM deleted不推荐按依赖于顺序的序列使用嵌套触发器。应使用单独的触发器层叠数据修改。说明  由于触发器在事务中执行,如果在一系列嵌套触发器的任意层中发生错误,则整个事务都将取消,且所有的数据修改都将回滚。在触发器中包含 PRINT 语句,用以确定错误发生的位置。
    递归触发器
    触发器不会以递归方式自行调用,除非设置了 RECURSIVE_TRIGGERS 数据库选项。有两种不同的递归方式: 直接递归 
    即触发器激发并执行一个操作,而该操作又使同一个触发器再次激发。例如,一应用程序更新了表 T3,从而引发触发器 Trig3。Trig3 再次更新表 T3,使触发器 Trig3 再次被引发。间接递归 
    即触发器激发并执行一个操作,而该操作又使另一个表中的某个触发器激发。第二个触发器使原始表得到更新,从而再次引发第一个触发器。例如,一应用程序更新了表 T1,并引发触发器 Trig1。Trig1 更新表 T2,从而使触发器 Trig2 被引发。Trig2 转而更新表 T1,从而使 Trig1 再次被引发。当将 RECURSIVE_TRIGGERS 数据库选项设置为 OFF 时,仅防止直接递归。若要也禁用间接递归,请将 nested triggers 服务器选项设置为 0。示例
    A. 使用递归触发器解决自引用关系
    递归触发器的一种用法是用于带有自引用关系的表(亦称为传递闭包)。例如,表 emp_mgr 定义了: 一个公司的雇员 (emp)。
    每个雇员的经理 (mgr)。
    组织树中向每个经理汇报的雇员总数 (NoOfReports)。 
    递归 UPDATE 触发器在插入新雇员记录的情况下可以使 NoOfReports 列保持最新。INSERT 触发器更新经理记录的 NoOfReports 列,而该操作递归更新管理层向上其它记录的 NoOfReports 列。USE pubs
    GO
    -- Turn recursive triggers ON in the database.
    ALTER DATABASE pubs
       SET RECURSIVE_TRIGGERS ON
    GO
    CREATE TABLE emp_mgr (
       emp char(30) PRIMARY KEY,
        mgr char(30) NULL FOREIGN KEY REFERENCES emp_mgr(emp),
        NoOfReports int DEFAULT 0
    )
    GO
    CREATE TRIGGER emp_mgrins ON emp_mgr
    FOR INSERT
    AS
    DECLARE @e char(30), @m char(30)
    DECLARE c1 CURSOR FOR
       SELECT emp_mgr.emp
       FROM   emp_mgr, inserted
       WHERE emp_mgr.emp = inserted.mgrOPEN c1
    FETCH NEXT FROM c1 INTO @e
    WHILE @@fetch_status = 0
    BEGIN
       UPDATE emp_mgr
       SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Add 1 for newly
       WHERE emp_mgr.emp = @e                            -- added employee.   FETCH NEXT FROM c1 INTO @e
    END
    CLOSE c1
    DEALLOCATE c1
    GO
    -- This recursive UPDATE trigger works assuming:
    --   1. Only singleton updates on emp_mgr.
    --   2. No inserts in the middle of the org tree.
    CREATE TRIGGER emp_mgrupd ON emp_mgr FOR UPDATE
    AS
    IF UPDATE (mgr)
    BEGIN
       UPDATE emp_mgr
       SET emp_mgr.NoOfReports = emp_mgr.NoOfReports + 1 -- Increment mgr's
       FROM inserted                            -- (no. of reports) by
       WHERE emp_mgr.emp = inserted.mgr         -- 1 for the new report.   UPDATE emp_mgr
       SET emp_mgr.NoOfReports = emp_mgr.NoOfReports - 1 -- Decrement mgr's
       FROM deleted                             -- (no. of reports) by 1
       WHERE emp_mgr.emp = deleted.mgr          -- for the new report.
    END
    GO
    -- Insert some test data rows.
    INSERT emp_mgr(emp, mgr) VALUES ('Harry', NULL)
    INSERT emp_mgr(emp, mgr) VALUES ('Alice', 'Harry')
    INSERT emp_mgr(emp, mgr) VALUES ('Paul', 'Alice')
    INSERT emp_mgr(emp, mgr) VALUES ('Joe', 'Alice')
    INSERT emp_mgr(emp, mgr) VALUES ('Dave', 'Joe')
    GO
    SELECT * FROM emp_mgr
    GO
    -- Change Dave's manager from Joe to Harry
    UPDATE emp_mgr SET mgr = 'Harry'
    WHERE emp = 'Dave'
    GO
    SELECT * FROM emp_mgr
    GO以下是更新前的结果:emp                            mgr                           NoOfReports
    ------------------------------ ----------------------------- -----------
    Alice                          Harry                          2
    Dave                           Joe                            0
    Harry                          NULL                           1
    Joe                            Alice                          1
    Paul                           Alice                          0以下为更新后的结果:emp                            mgr                           NoOfReports
    ------------------------------ ----------------------------- -----------
    Alice                          Harry                          2
    Dave                           Harry                          0
    Harry                          NULL                           2
    Joe                            Alice                          0
    Paul                           Alice                          0
      

  4.   

    若只采用insert触发,用户对现有记录A值的修改,B列将法做出应有的响应这是不合理的。
    需求是一定要保证的。没有人能很好的解释触发器的工作原理吗?
      

  5.   

    龙进真是屁话多, wgsasd311已经说得很好,还要如何解决,我晕