繁体   English   中英

检查是否授予特权的最简单方法,如果没有则授予它(Oracle + bash)

[英]Easiest way to check if granted privileges and if not then grant it (Oracle + bash)

我在 bash 中有脚本来授予 oracle 中的权限(30 次授予)。 该脚本在 cron 中,每天在特定时间开始。 我想通过最简单/最快的方式创建检查/如果仅在尚未授予权限的情况下授予权限。 有人可以帮忙吗?

不要费心检查他们是否拥有/没有获得特权。 只需授予/撤销它们,以便它最终获得正确权限的任何用户。

您可以编写 shell 脚本来生成包含 SQL 命令的文件,然后使用 SQL/Plus 运行该脚本。

下面的 PL/SQL 块仅授予缺少的权限。 我经常使用“预期减去实际”模式,并且学会了始终在错误消息中显示有问题的 SQL 语句的艰难方法。

--Grant missing privileges.
begin
    for missing_grants in
    (
        select grantee, table_name, privilege, 'grant ' || privilege || ' on ' || table_name || ' to asdf ' || grantee grant_ddl
        from
        (
            --Expected privileges:
            select 'TEST_USER' grantee, 'TEST1' table_name, 'SELECT' privilege from dual union all
            select 'TEST_USER' grantee, 'TEST2' table_name, 'SELECT' privilege from dual union all
            select 'TEST_USER' grantee, 'TEST2' table_name, 'INSERT' privilege from dual union all
            select 'TEST_USER' grantee, 'TEST2' table_name, 'UPDATE' privilege from dual union all
            select 'TEST_USER' grantee, 'TEST2' table_name, 'DELETE' privilege from dual
            minus
            --Actual privileges:
            select grantee, table_name, privilege
            from user_tab_privs
            where table_name in ('TEST1', 'TEST2')
        )
    ) loop
        begin
            execute immediate missing_grants.grant_ddl;
        exception when others then
            raise_application_error(-20000, 'Error with this SQL: ' || missing_grants.grant_ddl || chr(10) || sqlerrm);
        end;
    end loop;
end;
/

虽然您确实可以每次都重新运行授权,但您可能不想这样做有几个原因:

  1. 性能虽然 30 次授权通常会很快运行,但如果您的权限脚本增长,它可能会开始变慢。
  2. 锁定如果其他东西同时改变对象,您可能会遇到问题。 (尽管授权似乎确实避免了大多数锁定问题。例如,行锁不会停止授权。)
  3. 审计如果你审计 DDL 命令,频繁地重新授权会使审计线索充满噪音,并且很难判断发生了什么变化。

此外,您可能需要考虑 Gary Myers 的建议,将这个任务放在调度程序中。 只需一次调用 DBMS_SCHEDULER,您就可以将作业放入数据库中,而不必担心 shell 脚本或 cron。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM