授予从所有者帐户触发的权限

时间:2020-08-14 13:12:04

标签: oracle database-administration privileges

我在两个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帐户的权限,该帐户可以在其中禁用和启用相同的触发器。

1 个答案:

答案 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();
相关问题