启用&禁用db2中的触发器

时间:2017-02-16 03:02:15

标签: triggers db2 db2-luw

我正在尝试在db2中启用和禁用触发器。

我运行的命令:" ALTER TRIGGER CASE_STATUS_CHANGED DISABLE"

错误是"一个意外的令牌" DISABLE"发现在" CASE_STATUS_CHANGED"之后。预期的代币可能包括:" SECURED" .. SQLCODE = -104,SQLSTATE = 42601,DRIVER = 4.18.60"

有谁能让我了解如何在db2中启用和禁用触发器?

3 个答案:

答案 0 :(得分:3)

遗憾的是,DB2 LUW不允许禁用触发器。您只能DROP触发器。

有一个ALTER TRIGGER声明。这是获取该特定错误的原因,因为该语句可用于将触发器从NOT SECURED切换到SECURED并返回。

答案 1 :(得分:1)

晚了聚会,但想展示我用来禁用触发器的技巧。

我定义一个SMALLINT变量作为标志,然后触发器要做的第一件事就是检查变量值。如果等于零,则视为已禁用并且触发器结束。

create variable mytrigger1_enabled smallint default 1;

create or replace trigger mytrigger1
before insert or delete or update on employee for each row
begin
  if mytrigger1_enabled <> 0
    then
      -- do tasks
  end if;
end//

-- now, disable the trigger
set mytrigger1_enabled = 0;

-- now, enable it back
set mytrigger1_enabled = 1;

我知道这需要您可能需要做的更多工作,但对我来说,它可以完成工作。

答案 2 :(得分:0)

我定义了一个表和两个存储过程来启用和禁用触发器。 首先创建对象,然后在需要时调用SET_TRIGGER_OFF和SET_TRIGGER_ON过程。

CREATE TABLE SUSPENDED_TRIGGER (
  ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE ),
  TRIGNAME VARCHAR(30) NOT NULL UNIQUE,
  TRIGTEXT CLOB (2M) NOT NULL,
  SUSPENDTIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
  PRIMARY KEY (ID)
)

CREATE PROCEDURE SET_TRIGGER_OFF (IN TRIGNAME1 VARCHAR(30))
  LANGUAGE SQL
  MODIFIES SQL DATA
BEGIN ATOMIC
  DECLARE STMT1 CLOB (2M);
  IF EXISTS(SELECT TEXT FROM SYSCAT.TRIGGERS WHERE TRIGNAME=TRIGNAME1) THEN
    INSERT INTO SUSPENDED_TRIGGER (TRIGNAME, TRIGTEXT)
    SELECT TRIGNAME, TEXT FROM SYSCAT.TRIGGERS WHERE TRIGNAME=TRIGNAME1;
    SET STMT1 = 'DROP TRIGGER ' || TRIGNAME1;
    PREPARE S1 FROM STMT1;
    EXECUTE S1;
  END IF;
END

CREATE PROCEDURE SET_TRIGGER_ON (IN TRIGNAME1 VARCHAR(30))
  LANGUAGE SQL
  MODIFIES SQL DATA
BEGIN ATOMIC
  DECLARE STMT1 CLOB (2M);
  IF EXISTS(SELECT TRIGTEXT FROM SUSPENDED_TRIGGER WHERE TRIGNAME=TRIGNAME1) THEN
    SET STMT1 = (SELECT TRIGTEXT FROM SUSPENDED_TRIGGER WHERE TRIGNAME=TRIGNAME1);
    PREPARE S1 FROM STMT1;
    EXECUTE S1;
    DELETE FROM SUSPENDED_TRIGGER WHERE TRIGNAME=TRIGNAME1;
  END IF;
END