Oracle之用户、特权和角色
本文主要包括:
· 介绍创建用户
· 了解如何使用特权来确保用户能够在数据库中执行任务
· 介绍两种特权类型:系统特权和对象特权
· 介绍系统特权怎样允许执行操作,例如执行 DDL 语句
· 介绍对象特权怎样允许执行操作,例如执行 DML 语句
· 介绍如何将特权组合在一起形成角色
一、 用户
数据库使用表空间来存储对象,其中可以包含表、类型和 PL/SQL 代码等
表空间存储在数据文件 (datafile) 中
1. 创建用户
语法:
CREATE USER user_name IDENTIFIED BY password
[DEFAULT TABLESPACE default_tablespace]
[TEMPORARY TABLESPACE temporary_tablespace];
可以从 user_users 查询默认表空间和默认临时表空间
2. 修改用户密码
ALTER USER user_name IDENTIFIED BY password;
PASSWORD 可以用来修改当前登录用户的密码
3. 删除用户
DROP USER user_name;
注:如果要删除的用户模式中包含任何表或其他项,就必须在 DROP USER
语句中,在要删除的用户名后面加上关键字 CASCADE
二、 系统特权
系统特权(system privilege)允许用户在数据库中执行特定的操作,比如执行 DDL 语句
常用的系统特权如下表
特权组合在一起形成角色(role),授予用户的两种有用的角色是 CONNECT 和 RESOURCE<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+Q09OTkVDVCDUytDt08O7p8GsvdO1vcr9vt2/4qOsUkVTT1VSQ0Ug1MrQ7dPDu6e0tL2ouPfW1sr9vt2/4rbUz/OjrMjnse2hotDywdC1yDwvcD4KPHA+MS4gz/LTw7unytrT6M+1zbPM2MioPC9wPgo8cD5HUkFOVCBDUkVBVEUgU0VTU0lPTixDUkVBVEUgVVNFUixDUkVBVEUgVEFCTEUgVE8gdXNlcl9uYW1lOzwvcD4KPHA+16Kjusq508MgV0lUSCBBRE1JTiBPUFRJT04g0aHP7qOs1eLR+bG7ytrT6LXE08O7p77Nv8nS1LDR1eLW1szYyKjU2cra0+jG5Mv808O7pzwvcD4KPHA+R1JBTlQgRVhFQ1VURSBBTlkgUFJPQ0VEVVJFIFRPIHVzZXJfbmFtZVdJVEggQURNSU4gT1BUSU9OOzwvcD4KPHA+16Kjus2ouf29q9K71tbM2MioytrT6CBQVUJMSUOjrL7Nv8nS1L2ruMPM2MioytrT6Mv509DTw7unPC9wPgo8cD5DT05ORUNUIC8gQVMgU1lTREJBPC9wPgo8cD5HUkFOVCBFWEVDVVRFIEFOWSBQUk9DRURVUkUgVE8gClBVQkxJQzs8L3A+CjxwPjIuILzssunK2tPo08O7p7XEz7XNs8zYyKg8L3A+CjxwPs2ouf2y6dGvIHVzZXJfc3lzX3ByaXZpbGVnZSC/ydLUvOyy6cSzuPbTw7unvt/T0MTE0KnPtc2zzNjIqDwvcD4KPHA+My4gyrnTw8+1zbPM2MioPC9wPgo8cD7Tw7unsbvK2tPoz7XNs8zYyKjWrrrzo6y+zb/J0tTKudPD1eLW1szYyKjAtNa00NDM2LaotcTIzs7xo6zI57S0vajTw7untcg8L3A+CjxwPrWr1rTQ0MO709Cxu8ra0+i1xM+1zbPM2Mioo6yy2df3u+HKp7DcPC9wPgo8cD40LiCzt8/608O7p7XEz7XNs8zYyKg8L3A+CjxwPr/J0tTKudPDIFJFVk9LRSDT777ks7fP+sSzuPbTw7untcTPtc2zzNjIqDwvcD4KPHA+Q09OTiAvIEFTIFNZU0RCQTwvcD4KPHA+UkVWT0tFIENSRUFURSBUQUJMRSBGUk9NIHVzZXJfbmFtZTs8L3A+Cgo8cD7I/aGiILbUz/PM2MioPC9wPgo8cD621M/zzNjIqKOob2JqZWN0IHByaXZpbGVnZaOp1MrQ7dPDu6e21Mr9vt2/4rbUz/PWtNDQzNi2qLXEstnX96OswP3I57bUse3WtNDQIERNTCDT777kPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20141201/20141201092221106.png" alt="\">
1. 向用户授予对象特权
可以使用 GRANT 语句向用户授予对象特权
范例:以 store 用户的身份连接到数据库,并向 steve 用户授予以下特权:
对 products 表的 SELECT、INSERT、UPDATE对象特权以及对表 employees 的 SELECT 特权
CONN store/store_password
GRANT SELECT,INSERT,UPDATE ON store_products TO steve;
GRANT SELECT ON store.employees TO steve;
注:可以使用 GRANT 选项,这样被授予的用户就可以把这种特权再授予其他用户
GRANT SELECT ON store.customers TO steve WITH GRANT OPTION;
2. 检查已授予的对象特权
通过查询 user_tab_privs_made 可以检查某个用户对哪些表向其他用户开放了哪些对象特权
范例:检索 table_name 为 PRODUCTS 的行
SELECT grantee,table_name,grantor,privilege,grantable,hierarchy
FROM user_tab_privs_made
WHERE table_name="PRODUCTS';
通过查询 user_col_privs_made 可以检查某个用户对哪些列对象开放了哪些特权
范例:对 user_col_privs_made 进行查询
SELECT grantee,table_name,column_name,grantor,privilege,grantable
FROM user_col_privs_made
ORDER BY column_name;
注:
· 系统特权的传递使用 WITH ADMIN OPTION
· 对象特权的传递使用 WITH GRANT OPTION
3. 检查已接受的对象特权
通过查询 user_tab_privs_recd表可以检查某个用户被授予了哪些表上的哪些对象特权
范例:以 steve 用户的身份连接到数据库,并对 user_tab_privs_recd 进行查询
SELECT owner,table_name,grantor,privilege,grantable,hierarchy
FROM user_tab_privs_recd
ORDER BY table_name,privilege;
通过查询 user_col_privs_recd可以检查某个用户被授予了哪些列的对象特权
范例:对 user_col_privs_recd 进行查询
SELECT owner,table_name,column_name,grantor,privilege,grantable
FROM user_col_privs_recd;
4. 使用对象特权
用户被授予对象特权之后,就可以使用这种特权来执行特定的任务,
例如, steve 用户对 store.customers 具有 SELECT 特权
CONNECT steve/button
SELECT * FROM store.customers;
注:如果 steve 试图对 purchases 表 (steve 对该表没有任何权限) 进行检索,数据库就会报错
SELECT * FROM store.purchases;
5. 创建同义词
范例:以 system 用户的身份连接到数据库,并将 CREATE SYNONYM 系统特权授予 steve 用户
CONN system/oracle
GRANT CREATE SYNONYM TO steve;
范例:以 steve 身份连接到数据库,并执行一条 CREATE SYNONYM 语句,为 store.customers 表创建同义词
CONN steve/button
CREATE SYNONYM customers FOR store.customers;
6. 创建公共同义词
可以为表创建公共同义词 (public synonym) ,在创建公共同义词之后,所有的用户都可以
看到这个同义词,下面这4条语句执行以下任务:
· 以 system 用户的身份连接到数据库
· 将 CREATE PUBLIC SYNONYM 系统特权授予 store 用户
· 以 store 用户的身份连接到数据库
· 为 store.products 创建公共同义词
CONNECT system/oracle
GRANT CREATE PUBLIC SYNONYM TO store;
CONN store/store_password
CREATE PUBLIC SYNNONYM products FOR store.products;
7. 撤销用户的对象特权
可以使用 REVOKE 语句撤销某个用户的对象特权
范例:以 store 用户的身份连接到数据库,并撤销 steve 用户对 products 表的 INSERT 特权
CONN store/store_password
REVOKE INSER ON products FROM steve;
注:
· 系统特权在撤销时,该用户授予其它用户的特权不会消失
· 对象特权再撤销时,该用户授予其它用户的特权也会消失
四、 角色
角色就是一组特权,可以分配给用户或其它角色,角色的优点可以总结为如下几点:
· 并不是一次一个地将特权直接授予用户,而是先创建角色,向角色授予一些特权,
然后再将角色授予多个用户和角色
· 在增加或删除角色的某种特权时,被授予该角色的所有用户和角色都会自动获得
新增加的特权或自动失去这种特权
· 可以将多个角色授予用户或角色
· 可以为角色设置密码
1. 创建角色
要创建角色,必须具有 CREATE ROLE 系统特权
2. 为角色授权
3. 将角色授予用户
4. 检查授予用户的角色
通过查询 user_role_privs 可以检查已经授予用户哪些角色
注:
· 密码保护的角色是禁用的,必须输入密码才能使用该角色
· 创建角色的那个用户也会被授予该角色
5. 检查授予角色的系统特权
通过查询 role_sys_privs 可以检查已经授予角色哪些系统特权
6. 检查授予角色的对象特权
通过查询 role_tab_privs 可以检查已经授予角色哪些对象特权
7. 使用已授予角色的特权
对于无密码保护的角色,通过角色将特权授予用户之后,用户连接到数据库后就
可以立即使用这种特权了;
对于密码保护的角色,用户必须输入角色密码才能使用这个角色
SET ROLE role_name IDENTIFIED BY role_password;
8. 启用和禁用角色
可以禁用角色,ALTER ROLE 语句可以用来对角色进行修改,使其变为非默认角色
范例:以 system 用户身份连接到数据库,并对 john 用户进行修改,使 hr_manager 不再是默认角色
CONN system/oracle
ALTER USER john DEFAULT ROLE ALL EXCEPT hr_manager;
范例:使用 SET ROLE 命令启用 hr_manager 角色
SET ROLE hr_manager;
范例:将 hr_manager 角色设置为默认角色,它在退出登录后仍然保留
CONN system/oracle
ALTER USER john DEFAULT ROLE hr_manager;
范例:可以将角色设置为 NONE ,这表示没有角色
CONN john/brown
SET ROLE NONE;
范例:将角色设置为除 hr_manager 之外的任何角色
SET ROLE ALL EXCEPT hr_manager;
9. 撤销角色
REVOKE 语句可以用来撤销角色
REVOKE role_name FROM user_name;
10. 从角色中撤销特权
REVOKE 语句可以用来从角色中撤销某种特权
REVOKE ALL ON table_name FROM role_name;
11. 删除角色
DROP ROLE 语句可以用来删除角色
DROP ROLE role_name;