Triggers 启用&;在db2中禁用触发器

Triggers 启用&;在db2中禁用触发器,triggers,db2,db2-luw,Triggers,Db2,Db2 Luw,我试图在db2中启用和禁用触发器 我运行的命令:“ALTER TRIGGER CASE\u STATUS\u CHANGED DISABLE” 错误为“在“案例状态更改”后发现“意外令牌”禁用。预期令牌可能包括:“安全”。.SQLCODE=-104,SQLSTATE=42601,DRIVER=4.18.60 有人能告诉我如何在db2中启用和禁用触发器吗?不幸的是,db2 LUW不允许禁用触发器。您只能删除触发器 有一份声明。这是导致该特定错误的原因,因为该语句可用于将触发器从不安全切换到安全,然

我试图在db2中启用和禁用触发器

我运行的命令:“ALTER TRIGGER CASE\u STATUS\u CHANGED DISABLE”

错误为“在“案例状态更改”后发现“意外令牌”禁用。预期令牌可能包括:“安全”。.SQLCODE=-104,SQLSTATE=42601,DRIVER=4.18.60


有人能告诉我如何在db2中启用和禁用触发器吗?

不幸的是,db2 LUW不允许禁用触发器。您只能
删除触发器


有一份声明。这是导致该特定错误的原因,因为该语句可用于将触发器从
不安全
切换到
安全
,然后再切换回来。

迟到了,但想展示我禁用触发器的技巧

我定义了一个充当标志的
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;
创建变量mytrigger1\u启用smallint默认值1;
创建或替换触发器mytrigger1
在为每行插入、删除或更新员工之前
开始
如果mytrigger1\u已启用0
然后
--做任务
如果结束;
结束//
--现在,禁用触发器
设置mytrigger1\u enabled=0;
--现在,重新启用它
设置mytrigger1_enabled=1;

我知道它需要更多您可能想要的工作,但对我来说,它完成了任务。

我定义了一个表和两个存储过程来启用和禁用触发器。 首先创建对象,然后在需要时调用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

您运行的是哪种DB2变体?亲爱的?z/OS?至少对于z/OS,您不能通过.LUW禁用触发器。运行DB211.1Understand。感谢您的解释。如果希望通过更改数据库表级别中的变量/数据来启用/禁用触发器,这是一个好主意。真的很感谢你把它分享出去。另一件事,问题是在数据库级别禁用触发器时出现的错误,@data_henrik先前已经给出了答案。不管怎样,谢谢。嗨,你能解释一下你的答案吗?这对新读者也很好。ThanksBear记住,这实际上会删除并创建触发器,而不是“禁用”。这意味着影响所有连接。使用此方法时,请确保进入“脱机”维护窗口(脱机维护窗口=禁用与所有其他应用程序和用户的连接)。