【问题标题】:Truncate table privilege without stored procedures不使用存储过程截断表权限
【发布时间】: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


【解决方案1】:

没有程序你不能这样做。

你可以像这样动态地做:

CREATE OR REPLACE procedure pr_truncate_table(p_table_name varchar2) is
begin

     execute immediate 'truncate table ' || p_table_name || '';


 end;
/

【讨论】:

    【解决方案2】:

    我使用的解决方法是授予其他用户删除权限,然后使用删除而不是截断来删除行。这不是适当的截断,因为它不会清除已使用的存储空间,但它允许完成相同的任务。

    使用表所有者帐户

    GRANT delete on Table_Name to "User_Account";
    

    使用其他帐户

    Delete from Table_Name where 1=1;
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2010-10-12
      • 2011-06-11
      • 1970-01-01
      • 2017-10-16
      • 2012-11-05
      • 2012-03-17
      相关资源
      最近更新 更多