Oracle sqldeveloper触发器编译成功;无效错误 - 我的语法有什么问题?

问题描述 投票:0回答:1

我很困惑为什么我在 sqldeveloper、oracle 中创建的触发器能够成功编译:

CREATE OR REPLACE TRIGGER revoke_privileges_trigger
BEFORE DELETE ON department
FOR EACH ROW
BEGIN
EXECUTE IMMEDIATE 'REVOKE DELETE ON department FROM User1';
EXECUTE IMMEDIATE 'REVOKE DELETE ON department FROM User2';
EXECUTE IMMEDIATE 'REVOKE DELETE ON department FROM User3';
END;


Trigger REVOKE_PRIVILEGES_TRIGGER compiled

但是当我用这个测试它时: 从 DEPARTMENT 中删除,其中 DEP_NAME = 'Data Analytics';

通过尝试删除,我收到此错误代码:

命令中从第 51 行开始出错 - 从 DEPARTMENT 中删除,其中 DEP_NAME = 'Data Analytics' 命令行错误:51 列:13 错误报告 - SQL 错误:ORA-04098:触发器“SYSTEM.BEFORE_DELETE_USER1”无效且重新验证失败 04098. 00000 - “触发器 '%s.%s' 无效并且重新验证失败” *原因:尝试检索触发器以执行,但被 发现无效。这也意味着编译/授权 触发器失败。 *操作:选项是解决编译/授权错误, 禁用触发器,或放下触发器。

我想要的是撤销任何用户的权限,但是我正在为学校做这件事,所以不确定这是因为我是“系统”还是什么。

有人可以帮忙吗?我正在旋转轮子。

当我使用以下语法测试触发器时,我没想到会得到错误代码,而是具有更新权限的输出:delete from DEPARTMENT where DEP_NAME = 'Data Analytics';

oracle triggers oracle-sqldeveloper
1个回答
0
投票

编译触发器时不会评估动态 SQL 的正确性。像您所包含的 DDL 语句会生成隐式提交,这在触发器的上下文中是非法的。一般来说,DDL 不应该嵌入到应用程序代码中。

© www.soinside.com 2019 - 2024. All rights reserved.