我在两个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帐户的权限,该帐户可以在其中禁用和启用相同的触发器。
答案 0 :(得分:1)
只有被授予强大的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();