如何解决授予从所有者帐户触发的权限
我在两个Oracle帐户中都有一个触发器STUDENT_DATA_UPDATE。一个是所有者帐户,另一个是用户帐户。下面是详细信息。
拥有所有特权的所有者帐户:
<connection-url>jdbc:oracle:thin:@eu.national.com:15001/STUD</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>NATIONAL_OWN</user-name>
<password>********</password>
没有特权的用户帐户:
<connection-url>jdbc:oracle:thin:@eu.national.com:15001/STUD</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>NATIONAL_USR</user-name>
<password>********</password>
我可以从具有权限的OWNER帐户更改,禁用或启用触发器。但是我无法从USER帐户对触发器进行任何更改。我的问题是,我想授予将触发器从NATIONAL_OWN更改为NATIONAL_USR帐户的权限,该帐户可以在其中禁用和启用相同的触发器。
解决方法
只有被授予强大的alter any trigger
特权的用户才能启用或禁用另一用户的触发器,这可能是过大且危险的。您可以使用DDL触发器来限制它,但这只会变得更加复杂。
您可以在包装中创建包装程序,例如在NATIONAL_OWN
模式中:
create package trigger_pkg as
procedure disable_trigger;
procedure enable_trigger;
end trigger_pkg;
/
create package body trigger_pkg as
procedure disable_trigger is
begin
execute immediate 'alter trigger STUDENT_DATA_UPDATE disable';
end disable_trigger;
procedure enable_trigger is
begin
execute immediate 'alter trigger STUDENT_DATA_UPDATE enable';
end enable_trigger;
end trigger_pkg;
/
grant execute on trigger_pkg to NATIONAL_USR;
然后以NATIONAL_USR
的身份进行操作:
begin
NATIONAL_OWN.trigger_pkg.disable_trigger;
end;
/
和
begin
NATIONAL_OWN.trigger_pkg.enable_trigger;
end;
/
您可能有一个带有启用/禁用标志的过程,而不是您愿意的。
有没有一种方法可以真正地从Java代码中调用这些过程disable_trigger和enable_trigger。
您可以使用带有匿名块语法的CallableStatement:
stmt = conn.prepareCall("begin NATIONAL_OWN.trigger_pkg.disable_trigger; end;");
stmt.execute();
或ANSI语法:
stmt = conn.prepareCall("{ call NATIONAL_OWN.trigger_pkg.disable_trigger }");
stmt.execute();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。