Jer*_*via 2 oracle oracle10g oracle11g
我有一个关于 Oracle 和检查权限的问题。
我写了一些 php 脚本来“测试”我们环境中的各种东西。其中一项任务是检查用户是否对某个过程具有执行权限以及该过程是否有效/已编译。
这是查询
select ao.object_name, utp.grantee, ao.status, utp.privilege
from all_objects ao, user_tab_privs utp
where utp.owner = ao.owner and
ao.object_name = utp.table_name and
upper( ao.object_name ) = :object_name and
ao.object_type = 'PACKAGE' and
utp.privilege = 'EXECUTE' and
ao.status = 'VALID'
Run Code Online (Sandbox Code Playgroud)
这很有效,并为我们节省了程序特权的时间;我现在意识到我也可以仔细检查 all_tab_privs 以检查执行访问权限。
现在我的问题是,我如何对表格做类似的事情?我们遇到了一个问题,某个用户在表上有 SELECT 权限,但没有 UPDATE/INSERT 权限。我如何单独检查这些权限中的每一个。我查看了 all_tab_privs 但没有发现它显示了我想要的东西。它有我可以执行的过程,但是当我检查是否存在已知表时,它不存在。例如,我将运行以下
select * from all_tab_privs
where table_name = 'KNOWN_TABLE' and
grantee = 'CURRENT_USER'
and privilege in ( 'SELECT', 'UPDATE', 'INSERT' );
Run Code Online (Sandbox Code Playgroud)
但是我没有为表取回 3 行,我知道 100% 我已经可以选择/插入/更新它不返回任何内容。
有任何想法吗?谢谢你。
我知道我可以尝试插入/更新数据然后删除它,但我不想这样做。我宁愿不留下任何痕迹,因为这些脚本将定期运行,应该是可重复的,并且不应改变任何数据的状态,即使它只是表上的一个序列。
另外,如果您能提供一个我可以用来确定权限的可能查询的“列表”,那将是很好的。例如,要确定我是否有选择访问运行查询 1、2 和 3。如果任一返回数据,那么您必须选择 privs 等以进行插入/更新。
这对我来说看起来相当乐观,因为角色问题可能会变得非常复杂,特别是如果角色受到密码保护,而且如果不实际尝试 DML,我永远不会真正 100% 信任该方法。
尝试以下查询可能更简单:
select count(*)
from schema_name.table_name
where 1=0;
insert into schema_name.table_name
select *
from schema_name.table_name
where 1=0;
delete from schema_name.table_name
where 1=0;
update schema_name.table_name
set column_name = column_name
where 1=0;
Run Code Online (Sandbox Code Playgroud)
我相信如果没有授予权限(没有方便的数据库来检查它),这样的查询将会失败,并且它们永远不会修改任何数据。
顺便说一下,ANY 权限通常被认为是一个安全问题,因此如果授予任何用户权限,您可能希望系统失败。