ALTER TRIGGER¶
说明¶
更改触发器属性或编译触发器
参数¶
IF EXISTS
修改触发器时,若存在同名触发器则进行修改,否则会跳过操作,且会打印NOTICE提示信息
schema
触发器所属的模式名
tgname
要更改的触发器名
ENABLE
启用触发器
DISABLE
禁用触发器
newname
更改后的触发器名
COMPILE
显式地编译触发器。
注解
ALTER TRIGGER只能开关触发器,修改触发器名称或编译触发器,不能改变触发器的定义。
只有表的拥有者才能更改触发器属性。
不允许修改RI约束触发器。(参考示例)
触发器是否启用不影响其编译结果,且编译结果不影响其启用/禁用。
示例¶
示例1: 重命名触发器
-- 清理环境
DROP TRIGGER trg1;
DROP TRIGGER trg2;
DROP TABLE tab1 CASCADE;
-- 创建表
CREATE TABLE tab1 (a INT);
-- 创建触发器
CREATE TRIGGER trg1
BEFORE INSERT ON tab1 FOR EACH ROW
BEGIN
NULL;
END;
/
-- 重命名触发器
ALTER TRIGGER trg1 RENAME TO trg2;
-- 删除触发器和表
DROP TRIGGER trg2;
DROP TABLE tab1;
-- 触发器不存在时,重命名触发器
-- 使用 IF EXISTS 时,跳过操作,不报错
ALTER TRIGGER IF EXISTS trg2 RENAME TO trg3;
-- 不使用 IF EXISTS 时,语句报错
ALTER TRIGGER trg2 RENAME TO trg3;
ERROR, 触发器 "TRG2" 不存在或无权访问
示例2: 启用/禁用触发器
-- 清理环境
DROP TRIGGER trg2;
DROP TABLE tab2 CASCADE;
-- 创建表
CREATE TABLE tab2 (id INT, a INT);
-- 创建触发器
CREATE TRIGGER trg2
BEFORE INSERT OR UPDATE ON tab2 FOR EACH ROW
BEGIN
IF NEW.a ISNULL THEN
RAISE EXCEPTION 'a cannot be NULL value';
END IF;
END;
/
-- 触发器处于启用状态
-- 插入 NULL 失败, 触发器抛出异常
INSERT INTO tab2 VALUES(1, NULL);
ERROR, a cannot be NULL value
SELECT * FROM tab2 ORDER BY id;
ID(int) |A(int) |
总数目:0
-- 禁用触发器, 插入 NULL 成功
ALTER TRIGGER trg2 DISABLE;
INSERT INTO tab2 VALUES(2, NULL);
SELECT * FROM tab2 ORDER BY id;
ID(int) |A(int) |
-------------------------
2 |null |
总数目:1
-- 启用触发器, 插入 NULL 失败
ALTER TRIGGER trg2 ENABLE;
INSERT INTO tab2 VALUES(3, NULL);
ERROR, a cannot be NULL value
SELECT * FROM tab2 ORDER BY id;
ID(int) |A(int) |
-------------------------
2 |null |
总数目:1
-- 删除触发器和表
DROP TRIGGER trg2;
DROP TABLE tab2;
示例3: 不允许修改 RI 约束触发器
-- 清理环境
DROP TRIGGER trg3;
DROP PROCEDURE proc3;
DROP PROCEDURE proc4;
DROP TABLE tab4 CASCADE;
DROP TABLE tab3 CASCADE;
-- 创建表
CREATE TABLE tab3 (id INT PRIMARY KEY);
CREATE TABLE tab4 (a INT REFERENCES tab3(id));
-- 查看触发器状态
SELECT TGISCONSTRAINT FROM SYS_TRIGGER T, SYS_CLASS R
WHERE T.BASEOBJID = R.OID AND R.RELNAME IN ('TAB3', 'TAB4');
TGISCONSTRAINT(boolean) |
-----------------------------
true |
-----------------------------
true |
-----------------------------
true |
总数目:3
-- 重命名 RI 触发器
CREATE PROCEDURE proc3 AS
DECLARE
cur REFCURSOR;
tigger_name VARCHAR(256);
BEGIN
OPEN cur FOR SELECT TGNAME FROM SYS_TRIGGER T, SYS_CLASS R
WHERE T.BASEOBJID = R.OID AND R.RELNAME IN ('TAB3', 'TAB4');
LOOP
FETCH cur INTO tigger_name;
EXIT WHEN NOT FOUND;
BEGIN
EXECUTE 'ALTER TRIGGER '|| tigger_name ||' RENAME TO trg3';
EXCEPTION
WHEN OTHERS THEN
BEGIN
RAISE NOTICE 'RENAME TRIGGER FAILED!';
END;
END;
END LOOP;
CLOSE cur;
END;
/
EXEC proc3;
NOTICE, RENAME TRIGGER FAILED!
NOTICE, RENAME TRIGGER FAILED!
NOTICE, RENAME TRIGGER FAILED!
-- 查看触发器状态
SELECT TGISCONSTRAINT FROM SYS_TRIGGER T, SYS_CLASS R
WHERE T.BASEOBJID = R.OID AND R.RELNAME IN ('TAB3', 'TAB4');
TGISCONSTRAINT(boolean) |
-----------------------------
true |
-----------------------------
true |
-----------------------------
true |
总数目:3
-- 禁用 RI 触发器
CREATE PROCEDURE proc4 AS
DECLARE
cur REFCURSOR;
tigger_name VARCHAR(256);
BEGIN
OPEN cur FOR SELECT TGNAME FROM SYS_TRIGGER T, SYS_CLASS R
WHERE T.BASEOBJID = R.OID AND R.RELNAME IN ('TAB3', 'TAB4');
LOOP
FETCH cur INTO tigger_name;
EXIT WHEN NOT FOUND;
BEGIN
EXECUTE 'ALTER TRIGGER '|| tigger_name ||' DISABLE';
EXCEPTION
WHEN OTHERS THEN
BEGIN
RAISE NOTICE 'DISABLE TRIGGER FAILED!';
END;
END;
END LOOP;
CLOSE cur;
END;
/
EXEC proc4;
NOTICE, DISABLE TRIGGER FAILED!
NOTICE, DISABLE TRIGGER FAILED!
NOTICE, DISABLE TRIGGER FAILED!
-- 查看触发器状态
SELECT TGISCONSTRAINT FROM SYS_TRIGGER T, SYS_CLASS R
WHERE T.BASEOBJID = R.OID AND R.RELNAME IN ('TAB3', 'TAB4');
TGISCONSTRAINT(boolean) |
-----------------------------
true |
-----------------------------
true |
-----------------------------
true |
总数目:3
-- 删除存储过程和表
DROP PROCEDURE proc3;
DROP PROCEDURE proc4;
DROP TABLE tab4;
DROP TABLE tab3;
示例4: 编译触发器
drop table t1;
drop table t2;
drop trigger tri1;
create table t1(a int);
create table t2(a int);
CREATE OR REPLACE TRIGGER tri1
BEFORE INSERT ON t1
FOR EACH ROW
BEGIN
insert into t2 values(1);
END tri1;
/
select status from sys_object_status where oid in(select oid from sys_trigger where tgname='TRI1');
STATUS(int) |
-----------------
1 |
总数目:1
drop table t2;
alter trigger tri1 compile;
select status from sys_object_status where oid in(select oid from sys_trigger where tgname='TRI1');
STATUS(int) |
-----------------
0 |
总数目:1
create table t2(b int);
alter trigger tri1 compile;
select status from sys_object_status where oid in(select oid from sys_trigger where tgname='TRI1');
STATUS(int) |
-----------------
1 |
总数目:1
drop trigger tri1;
drop table t1;
drop table t2;