0

好的,所以我是 SQL 的新手,只是想知道是否有一种方法可以限制谁可以访问什么类型的数据,就从表中检索信息而言。例如,我有一个包含客户信息的表格,其中包含他的姓名、电话、地址、SSN、薪水等。我想知道是否有办法根据谁在查看来限制显示的内容那个数据。就像一个人 A 可以看到所有内容,而人 B 可以看到除了 SSN 和薪水之外的所有内容

编辑:

可以使用触发器来限制某个组的视图吗?

4

2 回答 2

2

您可以使用视图。之后,它取决于使用情况、人们如何访问数据(一些访问权限或用户组等)

于 2012-12-10T21:24:24.327 回答
1

要使某些用户不显示列,您需要为每个用户组提供不同的视图(即没有 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

数据神奇地出现了。

于 2012-12-10T21:29:58.880 回答