[英]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;
/
虽然您确实可以每次都重新运行授权,但您可能不想这样做有几个原因:
此外,您可能需要考虑 Gary Myers 的建议,将这个任务放在调度程序中。 只需一次调用 DBMS_SCHEDULER,您就可以将作业放入数据库中,而不必担心 shell 脚本或 cron。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.