pl/sql - 比较2个用户表中的记录计数

too*_*oop 2 sql database oracle plsql count

我在用户名'staff'的架构'staff'下有'stf_table'表.

我在'employee'架构下有'emp_table'表,用户名为'employee'.

这两个都在相同的数据库SID /主机/端口下,但用户'staff'没有查询架构'employee'下的表,反之亦然(即用户'employee'没有privelege查询表下架构'员工').但是每个用户都可以在自己的架构下查询表.注意:我无法授予额外的权限,我不想将两个表都转储到本地架构中.

是否可以编写一个PL/SQL proc或包来执行以下操作?

 select count(*) from stf_table;
 select count(*) from emp_table;
Run Code Online (Sandbox Code Playgroud)

然后将两个计数输出到一个文件(即.txt或.dat不关心),如下所示:

stf_table count: 47830
emp_table count: 36462
difference: 11368
counts match: FALSE
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 8

如果您不想为任一用户授予其他权限,则您没有很多选项.

您可以创建超级用户拥有的过程,例如具有SELECT ANY TABLE(但不是 SYS或SYSTEM)的帐户,该帐户同时进行计数并计算差异.

create function get_diff 
    return pls_integer
    authid definer
as 
    c1 pls_integer;
    c2 pls_integer;
begin
    select count(*) 
    into c1
    from staff.stf_table;
    select count(*)
    into c2
    from employee.emp_table;

    return abs(c1-c2);
end get_diff;
/
Run Code Online (Sandbox Code Playgroud)

所以关键是AUTHID DEFINER.这意味着该函数以拥有该函数的用户的权限运行; 因为他们具有查询用户可以运行该功能的两个表的必要权限,所以他们授予的任何其他用户也是如此EXECUTE ON GET_DIFF.

这真的是给予你可以逃脱的最低限度.


注意:我没有解决写入文件的问题,因为我并不认为这是你问题的主旨.主要是权限.


"因为用户'工作人员'将计数保存到文件中,所以无法连接proc.然后以用户'employee'连接将计数保存到同一个文件并进行比较?"

不,这不是安全模型的工作方式.

STAFF的数据归STAFF所有,EMPLOYEE的数据归EMPLOYEE所有.默认情况下,STAFF无法查看EMPLOYEE的数据,反之亦然.要改变这种情况,您有两种选择:

  1. 让STAFF将其表上的SELECT授予EMPLOYEE,并让EMPLOYEE将其表上的SELECT授予STAFF.
  2. 使用对两个模式表具有特权的帐户来完成工作.

显然,第一种方法可能存在数据保护问题.如果这是您关注的问题,那么您可以进行一些改进:

  1. 让每个模式拥有一个只选择其记录计数的视图,并为视图授予权限.
  2. 如果您拥有Enterprise Edition 10gR2或更高版本,则可以使用列级VPD:grant select on table put放置策略以隐藏所有敏感数据. 了解更多.