1

我在 Oracle DB 中创建了一个只读用户 A。(谁可以访问模式 X 但不能更改任何内容)然后我被要求授予用户 A 在模式 X 上创建表的权限。

但是据我所知,我可以给用户 A创建任何表权限或创建表权限。其中一个是在他/她自己的模式上创建表,另一个是在所有模式上创建表,这不应该是首选。

所以我给了用户 A创建任何表的权限,然后创建了一个触发器,阻止用户 A 在 X 以外的模式上创建表。

但是,我需要将触发器创建为用户 A,现在用户 A 可以轻松删除该触发器,因为 A 是所有者。有什么办法可以防止用户 A 放弃触发器,即使他/她是所有者?

据我所知,用户 A 不需要删除任何触发器或管理数据库触发器权限,因为触发器已经是他/她自己的了。

有什么解决方法吗?或者我应该寻找一种替代方法来授予对其他模式的创建表权限。

先感谢您。

4

1 回答 1

2

不,没有办法阻止用户删除它拥有的对象。

也没有办法直接允许用户 A 在用户 X 的模式中创建对象,除非您开始授予“ANY”权限。

一种可能的解决方法是在用户 X 的架构中创建一个存储过程,该存储过程将在用户 X 的架构中创建对象(立即执行),并将所述存储过程的 EXECUTE 权限授予用户 A。

因此,通过这种方式,用户 A 可以执行以下操作:

exec create_in_x_schema('create table blah(a number)');

该过程只会对传入的字符串立即执行。

A procedure that looks something like:
create or replace procedure create_in_x_schema(doit varchar2)
begin
  execute immediate doit;
end;
/

应该这样做。

(代码未经测试,但应该给你一些想法。)

希望有帮助。

于 2012-04-20T13:14:53.577 回答