Oracle 防止用户删除其';自己的触发器

Oracle 防止用户删除其';自己的触发器,oracle,Oracle,我在Oracle DB中创建了一个只读用户a。(谁可以访问模式X,但不能更改任何内容)然后我被要求在模式X上给用户一个CREATETABLE特权 然而,据我所知,我可以给用户一个创建任何表的权限,或者创建表的权限。其中一个用于在他/她自己的模式上创建表,另一个用于在所有模式上创建表,这不应该是首选 因此,我给了用户A创建任何表权限,然后创建了一个触发器,它阻止用户A在X以外的模式上创建表 但是,, 我需要以用户A的身份创建触发器,现在用户A可以轻松删除该触发器,因为A是所有者。 是否有任何方法可

我在Oracle DB中创建了一个只读用户a。(谁可以访问模式X,但不能更改任何内容)然后我被要求在模式X上给用户一个CREATETABLE特权

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

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

但是,, 我需要以用户A的身份创建触发器,现在用户A可以轻松删除该触发器,因为A是所有者。 是否有任何方法可以防止用户A丢弃触发器,即使他/她是所有者

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

有什么解决办法吗?或者,我应该寻找一种替代方法,在其他模式上授予CREATETABLE权限


提前感谢。

不,无法阻止用户删除其拥有的对象

也无法直接允许用户A在用户X的模式中创建对象,除非您开始授予“任意”权限

一种可能的解决方法是在用户X的模式中创建一个存储过程,该存储过程将在用户X的模式中创建对象(立即执行),并将所述存储过程的执行权限授予用户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;
/
我应该这样做

(代码未经测试,但应该会让您有所了解。)


希望这会有所帮助。

当然,该过程应该确保“doit”是您允许用户执行的操作。因此,使用DBMS_断言检查SQL。并添加代码以确认它是您允许的选项之一,如“创建表”。否则,X能做的任何事情,A都能做。绝对正确。我上面发布的代码可能存在很大的安全风险。这是严格的概念证明。