我如何编写将一次更新多个表的授权访问的 PLSQL 查询 |SQL Developer|

Posted

技术标签:

【中文标题】我如何编写将一次更新多个表的授权访问的 PLSQL 查询 |SQL Developer|【英文标题】:How do i write PLSQL Query that will update the grant access for multiple tables at once |SQL Developer| 【发布时间】:2019-08-16 09:28:58 【问题描述】:

我有一个场景,我需要编写一个 PLSQL 查询来一次为特定用户授予对多个表的权限,例如:User_A

tbl_1
tbl_2
tbl_3
tbl_4
tbl_5
tbl_6
tbl_7
tbl_8

上表仅作为读取访问。现在我想提供写权限,删除权限

我如何实现这个场景?

【问题讨论】:

【参考方案1】:

您可以将此类游标与execute immediate 命令一起使用,为您当前架构的所有表(User_A 以外的架构)授予User_A 所需的权限:

SQL> set serveroutput on
SQL> begin
  for c in
  (select 'grant insert, update, delete on '||t.table_name||' to User_A' as cmd
     from user_tables t
    order by t.table_name)
  loop 
    dbms_output.put_line(c.cmd);  
    execute immediate c.cmd;
  end loop;
end;

【讨论】:

一般来说,在立即执行之前最好有 DBMS_OUTPUT。因此,如果出现错误,我们知道哪个语句失败而不是最后一个成功 真的值得写,然后验证一个 10 语句的代码块,以避免写 8 个授权语句。此外,上面将授予每个表的权限。您需要为表和可能的用户传递多个值参数,然后将它们解析为单个值以生成适当的授权语句。如果您预计经常这样做,可能值得一试。【参考方案2】:

要真正回答您的问题并一次运行多个授权,您需要使用CREATE SCHEMA 命令。

语法有点棘手,因为您必须硬编码运行语句的用户名。如果其中一项赠款失败,它们都会失败,这可能是好事,也可能不是好事。但与 PL/SQL 脚本或多个 SQL 语句相比,这种方法使用的代码更少,速度也更快。

create schema authorization USER_RUNNING_THE_QUERY
grant select, insert, update, delete on tbl_1 to test_user1
grant select, insert, update, delete on tbl_2 to test_user1
grant select, insert, update, delete on tbl_3 to test_user1
grant select, insert, update, delete on tbl_4 to test_user1
grant select, insert, update, delete on tbl_5 to test_user1
grant select, insert, update, delete on tbl_6 to test_user1
grant select, insert, update, delete on tbl_7 to test_user1
grant select, insert, update, delete on tbl_8 to test_user1;

【讨论】:

以上是关于我如何编写将一次更新多个表的授权访问的 PLSQL 查询 |SQL Developer|的主要内容,如果未能解决你的问题,请参考以下文章

oracle的grant语句,一次只能授权一张表的访问权限吗?

oracle的grant语句,一次只能授权一张表的访问权限吗?

在 PLSQL 中,如何迭代更新一个非常大的表的字段?

如果 Column_X 更新,PLSQL 触发器记录对审计表的更新

PLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案

如何将SQL Server中多个表的数据一次性返回到一张EXCEL工作表(Sheet)中