我們經(jīng)常談及Oracle的權(quán)限 比如Connect DBA resource sysdba select any table select_catelog_role這樣一些權(quán)限 讓我們眼花繚亂的 那么如何來(lái)區(qū)分這些種類繁多的privilege中不至于眼迷離呢 這個(gè)文章將會(huì)對(duì)你在這方面的了解起到幫助
平江網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,平江網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為平江千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的平江做網(wǎng)站的公司定做!
以上我們看到的這些權(quán)限 都是可以通過(guò)grant語(yǔ)句來(lái)進(jìn)行權(quán)限賦予 同時(shí)也可以用過(guò)revoke來(lái)進(jìn)行權(quán)限收回的操作的 但是 他們雖然都在grant里出現(xiàn) 但是有各自有著本質(zhì)的不同
oracle里的權(quán)限有兩種權(quán)限 系統(tǒng)權(quán)限和對(duì)象權(quán)限 所謂系統(tǒng)權(quán)限 就是oracle里已經(jīng)hardcode寫死的權(quán)限 這些權(quán)限 我們是不能自己去擴(kuò)展的 比如上面提到的select any table create any table create table等 這里的權(quán)限已經(jīng)在oracle里全部規(guī)定好了
我們可以通過(guò)查看system_privilege_map這個(gè)數(shù)據(jù)字典表來(lái)查看所以的oracle系統(tǒng)內(nèi)置的權(quán)限
SQL select * from system_privilege_map;
PRIVILEGE NAME?????????????????????????????????????? PROPERTY
ALTER SYSTEM?????????????????????????????????????
AUDIT SYSTEM?????????????????????????????????????
CREATE SESSION???????????????????????????????????
ALTER SESSION????????????????????????????????????
RESTRICTED SESSION???????????????????????????????
這里就是所有的內(nèi)置的系統(tǒng)權(quán)限了 其實(shí)如果有開(kāi)發(fā)過(guò)權(quán)限系統(tǒng)的經(jīng)驗(yàn)的話 對(duì)這里的這個(gè)概念 可以理解為function permission 也就是你可以進(jìn)行哪些操作
這里特別提到一個(gè)另外的知識(shí)點(diǎn) 有網(wǎng)游朋友問(wèn)過(guò)我 create any table和create table有什么區(qū)別 create table只能老老實(shí)實(shí)的給自己的scheam創(chuàng)建表 而不能以create table otherschema tablename這樣的方式給其他的schema創(chuàng)建表 額外提到這點(diǎn) 有很多朋友這塊還是模糊的
oracle通過(guò)數(shù)據(jù)字典表dba_sys_privs這個(gè)表來(lái)記錄user被賦予的系統(tǒng)權(quán)限 比如
我們現(xiàn)在執(zhí)行
SQLgrant select any table to test ; 把select any table的權(quán)限賦予test 這個(gè)用戶
Grant succeeded
SQL select * from dba_sys_privs where grantee = TEST ;
GRANTEE??????????????????????? PRIVILEGE??????????????????????????????? ADMIN_OPTION
TEST ????????????????????????? SELECT ANY TABLE???????????????????????? NO
這里就可以查詢到這個(gè)記錄了 admin_option表示的是是否有把當(dāng)前這個(gè)系統(tǒng)權(quán)限grant給其他用戶的意思 yes 表示test 除了自己有這個(gè)權(quán)限 還可以把這個(gè)權(quán)限賦予其他用戶 N就是沒(méi)有g(shù)rant的權(quán)限了
我們可以用一下語(yǔ)句試試
SQL grant select any table to test with admin option;
Grant succeeded
在來(lái)看看剛才的記錄
GRANTEE??????????????????????? PRIVILEGE??????????????????????????????? ADMIN_OPTION
TEST ????????????????????????? SELECT ANY TABLE???????????????????????? YES
現(xiàn)在test 就可以賦予select any table給別的用戶了
下面我們看看object permission 其實(shí)這里已經(jīng)名字就可以區(qū)分開(kāi)了 這里是針對(duì)于特定的對(duì)象的權(quán)限 上面的系統(tǒng)權(quán)限是限定了可以操作的功能 而object permission就更細(xì)化了 具體到了莫個(gè)對(duì)象你可以操作的功能的權(quán)限
比如 A用戶建立了一個(gè)TableA表 現(xiàn)在為了讓B用戶可以看到A這個(gè)對(duì)象 我們就可以把A table的select權(quán)限 進(jìn)行賦予 這里的A table上的select權(quán)限就是一個(gè)對(duì)象權(quán)限
除了select 還有update delete insert alter drop index references這樣正對(duì)于對(duì)象的權(quán)限
除了可以給表對(duì)象指定對(duì)象權(quán)限外 view sequence procedure function package triggger MV等這些oracle里的對(duì)象都可以進(jìn)行對(duì)象的權(quán)限指定
對(duì)于對(duì)象權(quán)限來(lái)說(shuō) 由于對(duì)象權(quán)限完全是動(dòng)態(tài)的 在對(duì)一個(gè)對(duì)象進(jìn)行g(shù)rant的時(shí)候 才能看到具體的對(duì)象權(quán)限 所以對(duì)象權(quán)限是不像system privilege那樣有一個(gè)表來(lái)描述的 只有一個(gè)表來(lái)記錄用戶和這個(gè)用戶對(duì)于的對(duì)象權(quán)限的關(guān)系表 這個(gè)表就是dba_tab_privs;
這里這個(gè)名字比較容易讓人誤會(huì)為只有table的對(duì)象權(quán)限 其實(shí)不然 這里其他類型的對(duì)象的對(duì)象權(quán)限也會(huì)記錄進(jìn)來(lái)
實(shí)驗(yàn)一下 還是剛才的test 用戶 我現(xiàn)在把對(duì)象dbms_xplan的execute的權(quán)限給他 dbms_xplan這個(gè)有些朋友可能不熟悉 這是執(zhí)行計(jì)劃有關(guān)的一個(gè)對(duì)象 朋友們?nèi)绻麤](méi)有安裝執(zhí)行計(jì)劃的包 可以用dbms_output對(duì)象做實(shí)驗(yàn)
SQLgrant execute on dbms_xplan to test ;
SQLgrant execute on dbms_output to test ;
SQL select * from dba_tab_privs where grantee = TEST ;
GRANTEE??????????????????????? OWNER????????????????????????? TABLE_NAME???????????????????? GRANTOR??????????????????????? PRIVILEGE??????????????????????????????? GRANTABLE HIERARCHY
TEST ????????????????????????? SYS??????????????????????????? DBMS_XPLAN???????????????????? SYS??????????????????????????? EXECUTE????????????????????????????????? NO??????? NO
TEST ????????????????????????? SYS??????????????????????????? DBMS_OUTPUT??????????????????? SYS??????????????????????????? EXECUTE
這里注意和fuanction 不同的 這里有一個(gè)GRANTABLE的字段 意味和上面admin option一樣的作用
不過(guò)這里的sql不同了
SQLgrant execute on dbms_xplan to test with grant option;
這里是oracle里的權(quán)限了
不過(guò)有的人可能會(huì)問(wèn)道 咦 你是不是漏掉了 不是我們還可以
grant connect resource dba to username;嗎 那她們都是什么權(quán)限呀
在這里就要注意了 這里的connct resource dba都不是權(quán)限 而是一個(gè)role 角色 一個(gè)角色是 個(gè)或者多個(gè)系統(tǒng)權(quán)限或者對(duì)象權(quán)限的集合 是便于我們管理用戶賦權(quán)而演化而來(lái)的 這里的create role和賦予role權(quán)限我們就不詳談了 朋友們可以自己查一查相關(guān)資料 role是我們可以動(dòng)態(tài)建立的 建立的role可以用grant來(lái)賦予權(quán)限 或者把一個(gè)role賦予另一個(gè)role
我們可以通過(guò)dba_roles這個(gè)表來(lái)查詢系統(tǒng)里所有的role
SQL select * from dba_roles;
ROLE?????????????????????????? PASSWORD_REQUIRED
CONNECT??????????????????????? NO
RESOURCE?????????????????????? NO
DBA??????????????????????????? NO
SELECT_CATALOG_ROLE??????????? NO
EXECUTE_CATALOG_ROLE?????????? NO
DELETE_CATALOG_ROLE??????????? NO
我們可以把role的賦予一個(gè)用戶
比如
SQLgrant select_catalog_role to test ;
我們可以通過(guò)dba_role_privs來(lái)查詢相關(guān)用戶的role的賦予 比如
SQL select * from dba_role_privs where grantee = TEST ;
lishixinzhi/Article/program/Oracle/201311/16827
ORACLE中怎么設(shè)置SEQUENCE權(quán)限步驟如下:
1、Create Sequence
首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權(quán)限。
創(chuàng)建語(yǔ)句如下:
CREATE?SEQUENCE seqTest
INCREMENT?BY?1?--?每次加幾個(gè)
START?WITH?1?--?從1開(kāi)始計(jì)數(shù)
NOMAXvalue?--?不設(shè)置最大值
NOCYCLE?--?一直累加,不循環(huán)
CACHE?10;?--設(shè)置緩存cache個(gè)序列,如果系統(tǒng)down掉了或者其它情況將會(huì)導(dǎo)致序列不連續(xù),也可以設(shè)置為---------NOCACHE
2、得到Sequence值?
定義好sequence后,你就可以用currVal,nextVal取得值。
CurrVal:返回 sequence的當(dāng)前值
NextVal:增加sequence的值,然后返回 增加后sequence值
得到值語(yǔ)句如下:
SELECT?Sequence名稱.CurrVal?FROM?DUAL;?
如得到上邊創(chuàng)建Sequence值的語(yǔ)句為:
select?seqtest.currval?from?dual
在Sql語(yǔ)句中可以使用sequence的地方:
- 不包含子查詢、snapshot、VIEW的 SELECT 語(yǔ)句
- INSERT語(yǔ)句的子查詢中
- INSERT語(yǔ)句的values中
- UPDATE 的 SET中
如在插入語(yǔ)句中
insert?into?表名(id,name)values(seqtest.Nextval,'sequence?插入測(cè)試');
3、Alter Sequence?
擁有ALTER ANY SEQUENCE 權(quán)限才能改動(dòng)sequence. 可以alter除start至以外的所有sequence參數(shù).如果想要改變start值,必須 drop sequence 再 re-create。
4、Drop Sequence
DROP?SEQUENCE?seqTest;?
5、一個(gè)例子
create?or?replace?trigger?tri_test_id
before?insert?on?S_Depart???--S_Depart?是表名
for?each?row
declare
nextid?number;
begin
IF?:new.DepartId?IS?NULLor?:new.DepartId=0?THEN?--DepartId是列名
select?SEQ_ID.nextval?--SEQ_ID正是剛才創(chuàng)建的
into?nextid
from?sys.dual;
:new.DepartId:=nextid;
end?if;
end?tri_test_id;
一、創(chuàng)建
sys;//系統(tǒng)管理員,擁有最高權(quán)限
system;//本地管理員,次高權(quán)限
scott;//普通用戶,密碼默認(rèn)為tiger,默認(rèn)未解鎖
設(shè)置方法如下:
1、找到$ORACLE_HOME/client_1/network/admin目錄下的tnsnames.ora文件,并用文本模式打開(kāi)。
2、添加以下內(nèi)容:
本地實(shí)例名=
(DESCRIPTION?=
(ADDRESS?=?(PROTOCOL?=?TCP)(HOST?=?數(shù)據(jù)庫(kù)IP地址)(PORT?=?端口號(hào)))
(CONNECT_DATA?=
(SERVER?=?DEDICATED)
(SERVICE_NAME?=?服務(wù)名)
)
)
3、用工具登錄即可。