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

Grant permission to trigger from owner account

我的两个 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 帐户更改、禁用或启用触发器。但我无法从用户帐户对触发器进行任何更改。我的问题是,我想授予将触发器从 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;
/

您可以有一个带有 enable/disable 标志的程序,而不是您喜欢的。

Is there a way where i could actually call these procedures disable_trigger and enable_trigger from a java code.

您可以使用 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();