Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 存储过程、触发器、批处理和用户定义的函数 » 触发器

 

临时禁用触发器操作

您可以将触发器设置为在用户对列数据执行操作(触发触发器)时禁用触发器的操作。通过使用包含预定义连接变量的过程,仍可触发触发器以及执行其操作。然后,即使在触发触发器的情况下,用户也可以对列进行 INSERT、ALTER 或 DELETE 操作,而不执行触发器操作。

 ♦ 临时禁用单个触发器的操作
注意

如果您使用行级别触发器,则可使用 WHEN 子句来指定触发器的触发时间。

本示例根据是否存在连接变量来禁用触发器的操作。

  1. 创建一个插入后触发器,用于检查连接变量的状态,以确定触发器逻辑是否已启用。如果不存在连接变量,则启用触发器的操作:



    CREATE TRIGGER myTrig AFTER INSERT
    REFERENCING NEW AS new-name
    FOR EACH STATEMENT
    BEGIN
       DECLARE @execute_trigger integer;
       IF varexists('enable_trigger_logic') = 1 THEN
         SET @execute_trigger = enable_trigger_logic;
       ELSE
         SET @execute_trigger = 1;
       END IF;
       IF @execute_trigger = 1 THEN
          ... -your-trigger-logic
       END IF;
    END;
  2. 将以下代码添加到您的语句中,以调用在第 1 步中创建的触发器。该语句使用连接变量来控制触发器的禁用时间,并且必须包含要禁用的代码。

    ...
      IF varexists('enable_trigger_logic') = 0 THEN
           CREATE VARIABLE enable_trigger_logic INT;
      END IF;
      SET enable_trigger_logic = 0;
       ... execute-your-code-that-you-do-not-want-triggers-to-run
       SET enable_trigger_logic = 1;
       ... now-your-trigger-logic-will-do-its-work  
 ♦ 临时禁用多个触发器的操作

本示例使用示例 1 中的连接变量方法来控制多个触发器的操作。本示例将创建两个可用于启用和禁用多个触发器的过程。此外,还会创建一个函数,用于检查触发器操作是否已启用。

  1. 创建一个可用于禁用触发器操作的过程。该过程的行为取决于连接变量的值。

    CREATE PROCEDURE sp_disable_triggers()
    BEGIN
           IF VAREXISTS ('enable_trigger_logic') = 0 THEN
              CREATE VARIABLE enable_trigger_logic INT;
           END IF;
           SET enable_trigger_logic = 0;
    END;
  2. 创建一个可用于启用触发器操作的过程。该过程的行为取决于连接变量的值。

    CREATE PROCEDURE sp_enable_triggers()
    BEGIN
            IF VAREXISTS ('enable_trigger_logic') = 0 THEN
              CREATE VARIABLE enable_trigger_logic INT;
            END IF;
          SET enable_trigger_logic = 1;
    END;
  3. 创建一个可用于确定触发器操作是否已启用的函数:

    CREATE FUNCTION f_are_triggers_enabled()
    RETURNS INT
    BEGIN
           IF VAREXISTS ('enable_trigger_logic') = 1 THEN
             RETURN enable_trigger_logic;
           ELSE
              RETURN 1;
           END IF;
    END;
  4. 向用于控制触发器操作的执行时间的触发器添加 IF 子句:

    IF f_are_triggers_enabled() = 1 THEN
         ... your-trigger-logic
    END IF;
  5. 调用在第 2 步中创建的过程来启用触发器操作:

    CALL sp_enable_triggers();
    ... execute-code-where-trigger-logic-runs

    调用在第 1 步中创建的过程来禁用触发器操作:

    CALL sp_disable_triggers();
    ... execute-your-code-where-trigger-logic-is-disabled
 另请参见