防止用户丢弃其自己的触发器

时间:2012-04-20 11:35:48

标签: oracle

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

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

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

然而, 我需要以用户A创建触发器,现在用户A可以轻松地删除该触发器,因为A是所有者。 有什么办法可以防止用户A掉线,即使他/她是主人吗?

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

这有什么解决方法吗?或者我应该搜索另一种方法来为其他模式提供create table权限。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

除非您开始授予“任何”权限,否则也无法直接允许用户A在用户X的架构中创建对象。

一种可能的解决方法可能是在用户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;
/

应该这样做。

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

希望有所帮助。