好的,所以我是 SQL 的新手,只是想知道是否有一种方法可以限制谁可以访问什么类型的数据,就从表中检索信息而言。例如,我有一个包含客户信息的表格,其中包含他的姓名、电话、地址、SSN、薪水等。我想知道是否有办法根据谁在查看来限制显示的内容那个数据。就像一个人 A 可以看到所有内容,而人 B 可以看到除了 SSN 和薪水之外的所有内容
编辑:
可以使用触发器来限制某个组的视图吗?
您可以使用视图。之后,它取决于使用情况、人们如何访问数据(一些访问权限或用户组等)
要使某些用户不显示列,您需要为每个用户组提供不同的视图(即没有 SSN 的视图 A、受限组中用户的薪水等)。或使用细粒度访问控制 FGAC:http ://docs.oracle.com/cd/B19306_01/network.102/b14266/apdvcntx.htm
细粒度的访问控制直接应用于表,因此您不需要视图来实现它。
例如,一个非常简单的测试向您展示。假设任何具有 Oracle 角色“SSN_AUTH”的人都可以查看所有行的 SSN/Salary。没有它的人,不能。
SQL> create table person(id number, name varchar2(200), ssn varchar2(20), salary number(*,2));
Table created.
现在我们创建一个函数(无论如何,将它放在一个包中以获取真实代码)。该函数将为在表exists (select null from session_roles where role = 'SSN_AUTH')
上触发的每个查询应用一个静默谓词。person
即该谓词意味着如果您没有启用名为 SSN_AUTH 的角色,您将看不到数据。
SQL> create or replace function person_rls (p_owner in varchar2, p_name in varchar2)
2 return varchar2 as
3 v_sql varchar2(2000);
4 begin
5 v_sql := 'exists (select null from session_roles where role = ''SSN_AUTH'')';
6 return v_sql;
7 end person_rls;
8 /
Function created.
现在,我不想抑制行(尽管我们可以这样做)。我们只想抑制列数据。所以我们将此函数作为策略添加到表中,并告诉它要保护的列:
SQL> BEGIN
2 DBMS_RLS.ADD_POLICY(object_schema=>user, object_name=>'PERSON',
3 policy_name=>'SEC_PERSON', function_schema=>user,
4 policy_function=>'PERSON_RLS',--our function
5 sec_relevant_cols=>'ssn,salary', -- secure these cols.
6 sec_relevant_cols_opt=>dbms_rls.ALL_ROWS);
7 END;
8 /
PL/SQL procedure successfully completed.
SQL> insert into person values (1, 'DazzaL', 'asdklakjd', 10000.12);
1 row created.
SQL> commit;
Commit complete.
现在,如果我们没有设置角色:
SQL> set role none;
Role set.
SQL> select * from person;
ID NAME SSN SALARY
---------- -------------------- -------------------- ----------
1 DazzaL
工资 + SSN 是空白的..但是如果我们启用该角色。
SQL> set role all;
Role set.
SQL> select * From session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SELECT_CATALOG_ROLE
HS_ADMIN_SELECT_ROLE
PLUSTRACE
SSN_AUTH <--- we have it now.
SQL> select * from person;
ID NAME SSN SALARY
---------- -------------------- -------------------- ----------
1 DazzaL asdklakjd 10000.12
数据神奇地出现了。