Oracle DDL触发器阻止删表失效,测试报错求解决方案
问题解决方法
你遇到的问题主要有两个核心点,对应解决方式如下:
1. 修正触发器逻辑(可选但更严谨)
当前触发器会拦截所有DROP操作(比如删除视图、序列也会触发),如果只想阻止删除表的操作,需要添加对象类型判断:
CREATE OR REPLACE TRIGGER Exercitiul12 BEFORE DROP ON SCHEMA WHEN (ORA_DICT_OBJ_TYPE = 'TABLE') -- 仅针对表的删除操作触发 BEGIN RAISE_APPLICATION_ERROR(-20001, 'Nu puteti sterge tabelul ' || ORA_DICT_OBJ_NAME); END; /
2. 修正测试代码的执行方式
DDL语句不能直接嵌入PL/SQL块中执行,你有两种正确的测试方式:
- 方式一:直接执行删除语句,不需要包裹PL/SQL块
DROP TABLE Restaurant;
- 方式二:如果一定要用PL/SQL块,必须使用动态SQL
BEGIN EXECUTE IMMEDIATE 'DROP TABLE Restaurant'; END; /
按上述方式调整后,触发器会正常触发并抛出你定义的错误,阻止表被删除。
内容的提问来源于stack exchange,提问作者Eclipsa2
相关产品推荐
相关产品推荐

