■■控制用户访问
在多用户环境中,你想要控制数据库访问和使用的安全,可以用下面Oracle服务器提供的数据库安全措施:
:: 控制数据库访问
:: 在数据库中只允许访问指定的对象
:: 用Oracle数据字典确认给予的和收回的权限
:: 创建数据库对象的同义词
■权限
数据库安全可以被划分为两个范畴:系统安全和数据安全。系统安全在系统级别访问和使用数据库,例如,用户名和口令,分配给用户的磁盘空间和用户能够执行的系统操作;数据库安全包括访问和使用数据库对象和用户能够对数据库对象进行的操作。
:: 数据库安全:
–系统安全
–数据安全
:: 系统权限:授权访问数据库
:: 对象权限:操纵数据对象的内容
:: 方案:对象的集合,例如表、视图和序列
・权限:
权限是执行特殊SQL语句的权利。数据库管理员 (DBA) 是一个具有授予用户访问数据库及其对象的能力的高级用户。用户需要系统权限来访问数据库,需要对象权限来操纵数据库中对象的内容。用户也可以将被授予的权限给其它用户或者角色,角色是相关权限的命名分组。
・方案:
方案是对象的集合,例如,视图和序列的集合。方案被数据库用户所拥有,并且与用户有相同的名字。
■系统权限
:: 有100 多个可用权限
:: 数据管理员有执行任务的高级系统权限,例如:
–创建新用户
–删除用户
–删除表
–备份表
・典型的DBA权限:
系统权限 授权的操作
CREATE USER 受让人可以创建其他 Oracle 用户 (需要有 DBA 角色权限)。
DROP USER 受让人可以删除另一个用户。
DROP ANY TABLE 受让人可以删除在任意方案中的表。
BACKUP ANY TABLE 受让人用导出实用程序可以备份在任何方案中的任何表。
SELECT ANY TABLE 受让人可以查询在任何方案中的表、视图或快照。./././././
CREATE ANY TABLE 受让人可以在任何方案中创建表
■创建用户
DBA通过执行CREATE USER语句来创建用户,在这时用户没有任何权限。DBA可以给用户授予权限,这些权限决定用户能够在数据库级别做什么
CREATE USER user IDENTIFIED BY password;
在语法中:
user 是被创建的用户的名字
password 指定用户必须用该口令登录
eg:
CREATE USER scott
IDENTIFIED BY tiger;
User created.
■使用系统权限
:: 一旦一个用户被创建,DBA 能够授予指定的系统权限给一个用户
GRANT privilege[, privilege...]
TO user [, user| role, PUBLIC...];
在语法中:
privilege 要被授予的系统权限
user|role|PUBLIC 是用户的名字,角色的名字或PUBLIC,PUBLIC
指定每一个用户被授予权限
・典型的用户权限
现在已经创建了一个用户,DBA可以指定权限给该用户。
系统权限 授权的操作
CREATE SESSION 连接到数据库
CREATE TABLE 在用户的方案中创建表
CREATE SEQUENCE 在用户的方案中创建序列
CREATE VIEW 在用户的方案中创建视图
CREATE PROCEDURE 在用户的方案中创建存储过程、函数或包
注:当前会话的系统权限可以在字典视图SESSION_PRIVS中找到。
SQL> select * from session_privs;
PRIVILEGE
---------------------------
CREATE SESSION
ALTER SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
已选择14行。
■角色
角色是命名的可以授予用户的相关权限的组,该方法使得授予、撤回和维护权限容易的多。
一个用户可以使用几个角色,并且几个用户也可以被指定相同的角色。角色典型地为数据库应用程序创建。
:: 创建角色
create role manager;
Role created;
::授予权限给一个角色
grant create table ,create view
to manager;
Grant succeeded.
::授予一个角色给用户
grant manager to dehaan,SH;
Grant succeded;
■改变口令
DBA创建一个帐号并为每个用户初始化一个口令,你可以用ALTER USER语句改变你的口令。
语法
ALTER USER user IDENTIFIED BY password;
在语法中:
user 是用户的名字
password 指定新的口令
尽管该语句可以用于改变你的口令,还有许多其它的选择,为了改变任何其它的选项你必须有ALTER USER权限。
■对象权限
对象权限 是在指定的表、视图、序列或过程上执行指定动作的权限或权利。每个对象都有一个特殊的可授予的权限集。幻灯片上的表列出了各种对象的权限注意,可用于序列的权限只有SELECT和ALTER。UPDATE、REFERENCES和INSERT权限可以通过指定一个可更新列的子集被限制,SELECT的权限可以通过创建带一个列子集的视图并且只授予SELECT权限来限制。一个在同义词上被授予的权限将转换为由同义词引用的基表上的权限。
:: 不同的对象有不同的对象权限
:: 对象的所有者有关于该对象的所有权限
:: 对象的所有者能够给予指定的权限到独立的对象上
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];
在语法中:
object_priv 是将被授予的对象权限
ALL 指定所有对象权限
columns 从一个表或视图中指定被授予权限的列
ON object 是权限被授予的对象
TO 指定权限被授予谁
PUBLIC 授予权限给所有用户
WITH GRANT OPTION 允许被授予权限的人再授予对象权限给其他用户和角色
授予对象权限
不同的对象权限对于不同类型的方案对象的是有用的,一个用户自动拥有包含在该用户的方案中的所有对象权限,一个用户可以授予该用户所拥有的任何方案对象上任何对象权限给另一个用户或角色。如果授权包括WITH GRANT OPTION选项,那么,得到权限的用户可以再将权限授予其他的用户;否则,受让人可以使用权限,但不能授予它给其他用户。
object privilege Table View Sequence Procedure
ALTER √ √
DELETE √ √
EXECUTE √
INDEX √
INSERT √ √
REFERENCES √ √
SELECT √ √ √
UPDATE √ √
原则
:: 为了授予权限到一个对象上,对象必须在你自己拥有的方案中,或者你必须被用WITH GRANT OPTION选项授予了对象权限。
:: 一个对象所有者可以授予任何该对象上的对象权限给任何其他的用户或者数据库的角色。
:: 任何对象的所有者自动地获得该对象所有对象权限。
注:DBAs 通常分配系统权限;任何拥有对象的用户都可以授予对象权限。
■使用WITH GRANT OPTION和PUBLIC关键字
・WITH GRANT OPTION关键字
带WITH GRANT OPTION子句被授予的权限可以被受让人传递到其他的用户和角色。当授予者的权限被撤消时,用WITH GRANT OPTION子句授予的对象权限也被撤消。
・PUBLIC关键字
表的所有者可以用PUBLIC关键字给所有用户授权。
第二个例子允许所有用户从Alice的DEPARTMENTS表中查询数据。
※如果一个语句不用对象的全名,Oracle服务器隐式地用当前的用户名 (或方案) 作为对象名的前缀。例如,如果用户Scott查询DEPARTMENTS表,系统将从 SCOTT.DEPARTMENTS表中做选择。
如果一个语句不用对象的全名,并且当前用户不拥有该名字的对象,系统将用PUBLIC.作为对象名的前缀。例如,如果用户Scott查询USER_OBJECTS表,但Scott不拥有该表,系统将用PUBLIC.USER_OBJECTS公共同义词的方法从数据字典视图中进行选择。
■确认已授予的权限
数据字典视图 说明
ROLE_SYS_PRIVS 授予角色的系统权限
ROLE_TAB_PRIVS 授予角色的表权限
USER_ROLE_PRIVS 可由用户访问的角色
USER_TAB_PRIVS_MADE 授予用户的对象上的对象权限
USER_TAB_PRIVS_RECD 授予用户的对象权限
USER_COL_PRIVS_MADE 授予用户对象的列上的对象权限
USER_COL_PRIVS_RECD 授予用户在指定列上的对象权限
USER_SYS_PRIVS 授予用户的系统权限
eg:
如果你收到Oracle服务器错误信息 “table or view does not exist,”说明发生了下面的错误:
:: 指定的表或视图不存在
:: 试图在一个你没有适当权限的表或视图上执行一个操作。
你可以通过访问数据字典来查看你所有的权限。上面的表中描述了各种数据字典视图。
■撤消对象权限
:: 用REVOKE语句撤消授予其他用户的权限
:: 通过WITH GRANT OPTION子句授予其他用户的权限也被撤消
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}[CASCADE CONSTRAINTS];
在语法中:
CASCADE CONSTRAINTS 用于删除任何与该对象相关的约束和对象,例如索引、触发器、权限、完整性约束等。
■■数据库链接(DB link)
数据库链接连接允许用户访问在远程数据库上的数据
本地 远程
DBA select * from emp@HQ_ACME.com; HQ_ACME.com(DB中的emp表)
-------------------> ------------------------>
数据链接
一个数据库链接是一个指针,该指针定义一条从Oracle数据库服务器到另一个数据库服务器的通信路径。链接指针实际上在一个数据字典表中被定义为一个条目,为了访问该链
接,你必须被连接到包含数据字典条目的本地数据库。
一个数据库链接是一条有感知的路径,一个客户可以通过该路径连接到本地数据库 A,再用存储在数据库A中的链接访问数据库B中的信息,但连接到数据库B的用户不能使用同一
个链接来访问数据库A中的数据,他们必须定义一个链接,并存储在数据库B的数据字典中。
一个数据库链接的连接提供本地用户访问远程数据库上数据的能力,为了产生这种连接,在分布式计算机系统中的每个数据库必须有一个唯一的全局数据库名,全局数据库名唯
一地标识一个在分布式系统中的数据库服务器。
数据库链接最大的好处是,允许用户访问在远程数据库中的另一个用户的对象,但是他们被该对象所拥有的权限集合所限制,换句话说,一个本地用户可以访问远程数据库而不
需要是远程数据库上的用户。
※注:典型地,DBA负责创建数据库链接。字典视图USER_DB_LINKS包含有关用户可以访问的链接信息。
■创建数据库链接
CREATE PUBLIC DATABASE LINK hq.acme.com
USING 'sales'; //using 指出了一个远程DB的服务名.
Database link created.
:: 写使用数据链接的SQL语句.
SELECT * FROM emp@HQ.ACME.COM;
使用数据库链接
上面的例子显示了怎样创建数据库链接。USING子句指出了一个远程数据库的服务名。
一旦数据库连接被创建,你就可以写一个SQL语句访问远程站点中的数据。如果一个同义词被设置,你可以用同义词来写SQL语句。
eg:
CREATE PUBLIC SYNONYM HQ_EMP FOR emp@HQ.ACME.COM;
然后用该同义词写SQL语句:
SELECT * FROM HQ_EMP;
※你不能在远程对象上授予权限。