【发布时间】:2023-03-21 12:25:01
【问题描述】:
SYSTEM 创建了几个表,并希望授予 userA 截断表的能力。在 oracle 的文档中,最低权限是:
GRANT DROP ANY TABLE TO userA
https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10007.htm#SQLRF01707
如上所述,DROP ANY TABLE 的权限过于强大,无法授予用户,而且环顾四周,无法限制用户可以使用它截断的表。
前面的主题已经提到的正确方法是使用存储过程:
CREATE OR REPLACE procedure truncateTables
AS
BEGIN
execute immediate 'TRUNCATE TABLE table1';
end;
/
GRANT EXECUTE on system.truncateTables TO userA;
但是,如果我想完全避免使用任何存储过程,是否有另一种方法可以允许不是表所有者的用户截断表,但不具有可能具有破坏性的权限,例如“DROP ANY TABLE “?
【问题讨论】:
-
不,这是两个选项。为什么您首先希望用户截断表?这通常只是作为批处理加载的一部分您想要做的事情,在这种情况下调用存储过程似乎是一种非常合理的方法。
-
用户可能只是一个具有最低权限的数据库管理员,并且每天会运行批处理作业来截断大型日志数据库,这至少是目标。感谢您的澄清,似乎存储过程是唯一的选择。
-
@user10518 代理连接有帮助吗?它将允许您以表的所有者身份登录,这样您就可以在不泄露系统帐户密码的情况下截断表。
-
@JonHeller 隐藏密码并不是真正的问题。我只是认为可能有一种不那么“全有或全无”的方式来截断没有存储过程的表。
标签: oracle