在 A 中创建包 . 请注意,该包声明为 authid current_user ,这意味着它依赖于调用用户的特权而不是定义用户的特权 . 由于 A 无法查看表,因此我们使用动态SQL,以便将语法检查推迟到运行时
SQL> create package update_foo
2 authid current_user
3 as
4 procedure set_val( p_new_val in number );
5 end;
6 /
Package created.
SQL> ed
Wrote file afiedt.buf
1 create or replace package body update_foo
2 as
3 procedure set_val( p_new_val in number )
4 as
5 begin
6 execute immediate 'update b.foo set col1 = :new_val'
7 using p_new_val;
8 end;
9* end;
SQL> /
Package body created.
SQL> grant execute on update_foo to b;
Grant succeeded.
1 回答
您可以 . 但它是's probably not the best approach. The package would need to be declared as an invoker'的权利包 . 并且
UPDATE
语句需要使用动态SQL .在
B
中创建表在
A
中创建包 . 请注意,该包声明为authid current_user
,这意味着它依赖于调用用户的特权而不是定义用户的特权 . 由于A
无法查看表,因此我们使用动态SQL,以便将语法检查推迟到运行时现在,
B
可以执行包并修改数据然而,一般而言,这不是一种特别明智的方法 . 一般而言,在一个模式中使用代码而在另一个模式中使用对象的关键在于提供职责分离和职责分离 . 如果您必须以无论如何都可以针对该表发出
UPDATE
的用户身份登录,那么使用包来执行此操作并不会增加复杂性 .