BEGIN ATOMIC
FOR D AS
SELECT 'DROP TRIGGER ' || TRIGNAME AS DDL
FROM SYSCAT.TRIGGERS
WHERE TRIGSCHEMA = 'SOMESCHEMA'
AND TRIGNAME = 'SOMETRIGGER'
DO
EXECUTE IMMEDIATE D.DDL;
END FOR;
END@
对于实际的模式创建,我通常更喜欢保留一个“干净的”创建脚本(没有条件的东西)和一个单独的“删除”脚本来清理东西。如果这听起来像是为自己做多余的工作,那么可以使用某些技巧来从创建脚本生成 drop 脚本(使用来反转安装脚本,以及将语句转换为tac的一点正则表达式魔法;这确实意味着模糊除非您希望正则表达式变得非常混乱,否则在您如何格式化 SQL 方面受到纪律处分)。CREATEDROP
CREATE PROCEDURE drop_trigger (trigschema varchar(128),
trigname varchar(128))
LANGUAGE SQL
BEGIN
DECLARE tmpstmt VARCHAR(300);
SET tmpstmt = 'drop trigger ' || trigschema || '.' || trigname;
A: BEGIN
-- Do nothing if drop trigger fails
DECLARE CONTINUE HANDLER FOR SQLSTATE '42704'
BEGIN
END;
EXECUTE IMMEDIATE tmpstmt;
END;
END @
另一种方法是
FOR
循环只DROP
为存在的对象执行语句。坦率地说,这对于单个对象来说是多余的,但在处理模式负载时它很有用。例如:很久以前,我在DROP_SCHEMA例程中使用了类似的技巧(页面底部的源链接),尽管它现在是多余的。
上述技巧也可用于“仅那些存在的对象”和/或“仅那些不存在的对象”的条件升级。
对于实际的模式创建,我通常更喜欢保留一个“干净的”创建脚本(没有条件的东西)和一个单独的“删除”脚本来清理东西。如果这听起来像是为自己做多余的工作,那么可以使用某些技巧来从创建脚本生成 drop 脚本(使用来反转安装脚本,以及将语句转换为
tac
的一点正则表达式魔法;这确实意味着模糊除非您希望正则表达式变得非常混乱,否则在您如何格式化 SQL 方面受到纪律处分)。CREATE
DROP
如果删除不存在的触发器,您可以创建一个忽略生成的错误的过程:
您可以调用如下过程:
长期的解决方案是为数据库使用一个版本,并忽略所有已经存在的版本。每次提交都会在错误回滚时创建一个新版本,因此您永远不会在版本之间结束。不用说,您需要阻止此进程之外的所有 ddl 操作。