客戶有個需求,一張150多個字段的表,客戶要求只將部分字段給掃描公司的人看,這個需求用視圖就可以很容易實現,客戶又要求,這些字段,掃描公司只可以修改其中的個別字段,我之前還真沒遇到這樣在列級別做權限控制的需求,做了個實驗,感覺很有意思,記錄下測試過程。
1.創建測試表并插入點測試數據:
SQL> create table test( id number,table_name varchar2(50),
owner varchar2(50),TABLESPACE_NAME varchar2(50));
Table created.
SQL> insert into test select rownum,table_name,owner,
TABLESPACE_NAME from dba_tables;
5490 rows created.
SQL> commit;
Commit complete.
2.創建測試用戶并賦予基本權限:
SQL> CONN / AS SYSDBA
Connected.
SQL> create user stream identified by stream default tablespace users;
User created.
SQL> grant connect,resource to stream;
Grant succeeded.
3.賦予測試用戶列級權限:
SQL> conn auth/auth
Connected.
SQL> grant update (id) on test to stream;
Grant succeeded.
SQL> grant insert (table_name) on test to stream;
Grant succeeded.
SQL>
SQL> grant select on test to stream;
Grant succeeded.
4.查詢列級權限設置信息:
SQL> select GRANTEE,OWNER,TABLE_NAME,COLUMN_NAME,GRANTOR,PRIVILEGE,
GRANTABLE from user_col_privs;
GRANTEE OWNER TABLE_NAME COLUMN_NAME GRANTOR PRIVILEGE GRA
------- ----- ---------- ----------- ------- --------- ---
STREAM AUTH TEST TABLE_NAME AUTH INSERT NO
AUT AUTH TEST ID AUTH INSERT NO
AUT AUTH TEST ID AUTH UPDATE NO
STREAM AUTH TEST ID AUTH UPDATE NO
5.登陸測試用戶驗證SELECT權限:
SQL> conn stream/stream
Connected.
SQL> select * from(select * from auth.test order by 1) where rownum< =10;
ID TABLE_NAME OWNER TABLESPACE
---------- -------------------- ---------- ----------
1 ICOL$ SYS SYSTEM
2 IND$ SYS SYSTEM
3 COL$ SYS SYSTEM
4 CLU$ SYS SYSTEM
5 TAB$ SYS SYSTEM
6 LOB$ SYS SYSTEM
7 COLTYPE$ SYS SYSTEM
8 SUBCOLTYPE$ SYS SYSTEM
9 NTAB$ SYS SYSTEM
10 REFCON$ SYS SYSTEM
10 rows selected.
6.驗證列級UPDATE權限控制:
SQL> update auth.test set owner='STREAM' where id =1;
update auth.test set owner='STREAM' where id =1
*
ERROR at line 1:
ORA-01031: insufficient privileges
可見,不允許修改測試表的OWNER字段的值,報ORA-01031:權限不足,由于上文賦予了測試用戶對修改測試表ID字段的修改權限,修改ID字段是可以的。
SQL> update auth.test set id=10 where id=1;
1 row updated.
SQL> rollback;
Rollback complete.
7.驗證列級INSERT權限控制:
SQL> insert into auth.test values(1,'stream','stream','users');
insert into auth.test values(1,'stream','stream','users')
*
ERROR at line 1:
ORA-01031: insufficient privileges
可見,整行插入是不被允許的,也是權限不夠,由于上文賦予了測試用戶對修改測試表TABLE_NAME字段的插入權限,所以插入TABLE_NAME字段是可以的,但是前提是其他字段沒有NOT NULL約束。
SQL> insert into auth.test(table_name) values ('stream');
1 row created.
SQL> rollback;
Rollback complete.
原文轉自:http://blogread.cn/it/article/5558