Oracle 防止用户删除其';自己的触发器
我在Oracle DB中创建了一个只读用户a。(谁可以访问模式X,但不能更改任何内容)然后我被要求在模式X上给用户一个CREATETABLE特权 然而,据我所知,我可以给用户一个创建任何表的权限,或者创建表的权限。其中一个用于在他/她自己的模式上创建表,另一个用于在所有模式上创建表,这不应该是首选 因此,我给了用户A创建任何表权限,然后创建了一个触发器,它阻止用户A在X以外的模式上创建表 但是,, 我需要以用户A的身份创建触发器,现在用户A可以轻松删除该触发器,因为A是所有者。 是否有任何方法可以防止用户A丢弃触发器,即使他/她是所有者 根据我的经验,用户A不需要拥有删除任何触发器或管理数据库触发器的权限,因为触发器已经是他/她自己的了 有什么解决办法吗?或者,我应该寻找一种替代方法,在其他模式上授予CREATETABLE权限Oracle 防止用户删除其';自己的触发器,oracle,Oracle,我在Oracle DB中创建了一个只读用户a。(谁可以访问模式X,但不能更改任何内容)然后我被要求在模式X上给用户一个CREATETABLE特权 然而,据我所知,我可以给用户一个创建任何表的权限,或者创建表的权限。其中一个用于在他/她自己的模式上创建表,另一个用于在所有模式上创建表,这不应该是首选 因此,我给了用户A创建任何表权限,然后创建了一个触发器,它阻止用户A在X以外的模式上创建表 但是,, 我需要以用户A的身份创建触发器,现在用户A可以轻松删除该触发器,因为A是所有者。 是否有任何方法可
提前感谢。不,无法阻止用户删除其拥有的对象 也无法直接允许用户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都能做。绝对正确。我上面发布的代码可能存在很大的安全风险。这是严格的概念证明。