我在Oracle DB中创建了一个只读用户A. (谁可以访问模式X但不能更改任何内容)然后我被要求为模式X授予用户A创建表权限。
但据我所知,我可以为用户A或创建表格权限提供创建任何表格权限。其中一个用于在他/她自己的模式上创建表,另一个用于在所有模式上创建表,这不应该是首选。
所以我给用户A提供了创建任何表特权,然后创建了一个触发器,阻止用户A在X以外的模式上创建表。
然而, 我需要以用户A创建触发器,现在用户A可以轻松地删除该触发器,因为A是所有者。 有什么办法可以防止用户A掉线,即使他/她是主人吗?
据我所知,用户A不需要删除任何触发器或管理数据库触发器权限,因为触发器已经是他/她自己的。
这有什么解决方法吗?或者我应该搜索另一种方法来为其他模式提供create table权限。
提前谢谢。
答案 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;
/
应该这样做。
(代码未经测试,但应该给你一些想法。)
希望有所帮助。