SQL数据库限制数据视图

时间:2012-12-10 21:20:29

标签: sql oracle security policy

好的,所以我是SQL的新手,只是想知道是否有一种方法来限制谁可以在从表中重新获取信息时访问哪种类型的数据。例如,我有一个表格,其中包含有关客户的信息,这些信息将包含他的姓名,电话,地址,SSN,工资等。我想弄清楚是否有办法根据观看者限制所显示的内容那个数据。正如在人A中可以看到一切,而人B可以看到除SSN和薪水之外的所有内容

编辑:

是否可以使用触发器限制某个组的视图工作?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

要使某些用户不显示列,您需要为每个用户组提供不同的视图(即,没有SSN的视图A,受限制组中的用户的工资等)。或使用细粒度访问控制 FGAC:http://docs.oracle.com/cd/B19306_01/network.102/b14266/apdvcntx.htm

细粒度访问控制直接适用于表,因此您不需要视图来实现它。

e.g。一个非常简单的测试来向您展示。假设任何具有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

数据神奇地出现。