Oracle的权限

系统权限:赋予用户执行某些系统范围内的操作能力,如:
有CREATE SESSION系统权限的用户能连接到数据库服务器并建立数据库会话。
有CREATE TABLE系统权限的用户能在自己的模式中创建表。
有CREATE ANY TABLE系统权限的用户能在数据库的任何模式中创建表
有CREATE ANY TYPE系统权限的用户能在系统的任何模式中创建类型及关联类型体。
有SELECT ANY TABLE系统权限的用户能查看数据库中的任何表
有EXECUTE ANY PROCEDURE系统权限的用户能在数据库中执行任何存储过程、存储函数或打包部件。
有EXECUTE ANY TYPE系统权限的用户能引用和执行数据库中任何类型的方法。


数据库管理员是唯一拥有强大的ALTER DATABASE系统权限的用户,改权限允许某人更改数据库系统的物理结构和有效性。
开发人员通常需要若干个系统权限,包括:CREATE TABLE,CREATE VIEW和CREATE TYPE系统权限,以便支持前端应用程序的数据库模式。
系统中的每个用户多有CREATE SESSION权限,该权限允许用户连接到数据库服务器。


对象权限:是一种赋予用户在指定的数据库对象(如表、视图或存储过程等)上执行特定类型的操作权限:
具有对CUS视图的SELECT对象权限的用户能够查询视图并检索信息。
具有对CUSTOMERS表的INSERT对象权限能够向该表插入新航。
具有对partType对象类型的EXECUTE对象的用户在创建其他数据库对象并执行该对象的方法时能够使用该类型。



授予用户系统权限

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SEQUENCE, CREATE TYPE
TO YZHQ
WITH ADMIN OPTION;


收回
REVOKE CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SEQUENCE, CREATE TYPE
FROM YZHQ;

不能向其他用户授权
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SEQUENCE, CREATE TYPE
TO YZHQ;

e.g.
SQL> grant create table to becvx;
grant create table to becvx
*
ERROR 位于第 1 行:
ORA-01031: 权限不足


授予用户对象权限
表: SELECT, INSERT, UPDATE, DELETE, ALTER, INDEX, RREFERENCES
INDEX权限授权者为表创建索引,当声明了参照完整性约束时,REFERENCES权限允许授权者参照这个表
可以为INSERT,UPDATE和REFERENCES权限授予列选择权限

视图:SELECT, INSERT, UPDATE, DELETE
可以为INSERT和UPDATE权限授予列选择权限

序列:SLEECT, ALTER
SELECT权限让授权者利用序列的NEXTVAL和CURRVAL伪列来生成和重用序列号

过程、函数、包、对象类型:EXECUTE
用于对象类型的EXECUTE权限让授权者在创建其他模式对象和类型时使用该对象类型,同时让授权者执行该类型的方法。



GARNT INSERT, UPDATE, DELETE, SELECT
ON customers
to lellision;
授予 INSERT, UPDATE, DELETE, SELECT权限


GRANT ALL PRIVILEGES
ON orders
TO lellision
WITH GRANT OPTION;
将ORDERS表的全部对象权限授予了LELLISON,同时附带了将ORDERS表的表权限授予了其他用户的选项

GRANT SELECT,
INSERT (id, lastname, firstname),
UPDATE (lastname, firstname),
REFERENCE (id)
ON salesreps
TO lellison;
权限仅为指定的列授权


撤销:
REVOKE UPDATE, DELETE ON customers
FROM lellision;

REVOKE ALL PRIVILEGES ON orders
FROM lellison;

REVOKE RREFERENCE ON salesreps
FROM lellison
CASCADE CONSTRAINTS;

CASCADE CONSTRAINTS 表明你要输出所有将撤销的REFERENCES对象权限所创建的参照完整性约束。
当为表相关性的对性类型撤销EXECUTE对象权限时,FORCE选项是必须的。



按角色的权限管理

预定义数据库角色(常见的5个):
CONNECT 基本的用户角色,允许授权者链接到数据库,然后在相关的模式中创建表、视图、同义词、序列和一些其他的对象类型
RESOURCE 建议用于典型的应用开发人员。该角色允许授权者在相关的模式中创建表、序列、数据簇、过程、函数、包、触发器、
对象类型、基于函数的索引和用户自定义的操作符
DBA 建议用户管理员。该角色允许授权者执行任何数据库功能,因为它包含了说有的系统权限。此外,改DBA角色的授权者
可以向任何其他数据库用户或角色授予任何系统权限
SELECT_CATALOG_ROLE 该角色允许授权者查询管理员(DBA_)数据字典视图
EXECUTE_CATALOG_ROLE 该角色允许授权者运行预制的DBMS工具包


创建角色
CREATE ROLE appdev
IDENTIFIED BY yeRtw;

注意:创建一个角色时,Oracle自动把该角色及其管理权授予你,以便你能改变、删除该角色以及将该角色授予其他角色和用户。
另外,角色归系统所有,而非角色创建者所有。

给角色授予系统权限和角色

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX,
CREATE SEQUENCE, CREATE TYPE
TO appdev;

为角色授予带有管理权限的系统权限和角色是不明智的。

GARNT INSERT, UPDATE, DELETE, SELECT
ON customers
to appdev;


GRANT ALL PRIVILEGES
ON orders
TO appdev
WITH GRANT OPTION;


GRANT SELECT,
INSERT (id, lastname, firstname),
UPDATE (lastname, firstname),
ON salesreps
TO appdev;

注意:Oracle不允许向一个角色授予表的REFERENCES对象权限-------当用户需要这个权限时,必须直接把权限授予该用户。


##########################
## 设置用户的缺省角色 ##
##########################

SQL> desc user_role_privs
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
USERNAME VARCHAR2(30)
GRANTED_ROLE VARCHAR2(30)
ADMIN_OPTION VARCHAR2(3)
DEFAULT_ROLE VARCHAR2(3)
OS_GRANTED VARCHAR2(3)

当为用户授予角色时,Oracle自动的添加该角色到用户的缺省角色列表中。



SQL> create user rhora identified by rhora;

用户已创建

SQL> grant connect, resource, dba to rhora;

授权成功。

SQL> conn rhora/rhora
已连接。
SQL> select * from user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
RHORA CONNECT NO YES NO
RHORA DBA NO YES NO
RHORA RESOURCE NO YES NO


注意:如果用户不具带有CREATE SESSION系统权限的缺省角色,就必须直接为该用户授予CREATE SESSION系统权限,
否则这个用户将不能建立数据库会话。

QL> conn /as sysdba
已连接。
SQL> alter user rhora default role resource;

用户已更改。

SQL> conn rhora/rhora
ERROR:
ORA-01045: user RHORA lacks CREATE SESSION privilege; logon denied


警告: 您不再连接到 ORACLE。
SQL> conn /as sysdba
已连接。
SQL> grant CREATE SESSION to rhora;

授权成功。

SQL> conn rhora/rhora
已连接。
SQL> select * from user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
RHORA CONNECT NO NO NO
RHORA DBA NO NO NO
RHORA RESOURCE NO YES NO

SQL>


将用户的角色connect, resource, dba重新添加到缺省列表中

SQL> conn /as sysdba
已连接。
SQL> alter user rhora default role connect,resource,dba;

用户已更改。

SQL> conn rhora/rhora
已连接。
SQL> select * from user_role_privs;

USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
RHORA CONNECT NO YES NO
RHORA DBA NO YES NO
RHORA RESOURCE NO YES NO



######################################################################################

启用和禁用角色

(1)会话可以使用带有ALL选项的SET ROLE命令来启用对帐号授权的所有角色。然而,当要启用需要口令的角色时,必须使用
IDENTIFIED BY参数指定该角色及其用户。

(2)使用SET ROLE命令的NONE选项可以禁用会话的角色。

(3)Oracle自动地禁用已经授权但没有使用SET ROLE命令启用的角色。

显示当前会话启用的角色列表,输入select * from session_roles 进行查询


SQL> conn /as sysdba
已连接。

SQL> create role appdev identified by yeTtw;

角色已创建

SQL> grant CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SEQUENCE, CREATE TYPE
2 TO appdev;

授权成功。

SQL> create user rhora identified by rhora ;

用户已创建

SQL> grant connect, resource, select_catalog_role, hs_admin_role to rhora;

授权成功。

SQL> grant appdev to rhora;

授权成功。

SQL> conn rhora/rhora
已连接。
SQL> select * from session_roles;

ROLE
------------------------------
CONNECT
HS_ADMIN_ROLE
RESOURCE
SELECT_CATALOG_ROLE
APPDEV


如果密码输错就会报如下的错误:

SQL> set role appdev identified by abc;
set role appdev identified by abc
*
ERROR 位于第 1 行:
ORA-01979: 角色'APPDEV'缺少口令或口令无效

使用SET ROLE语句来启用APPDEV角色和禁用CONNECT, RESOURCE等其他角色。

SQL> set role appdev identified by yeTtw;

角色集


SQL> select * from session_roles;

ROLE
------------------------------
APPDEV


开启 CONNECT, RESOURCE角色

SQL> set ROLE
2 CONNECT,
3 RESOURCE
4 ;

角色集

SQL> SELECT * FROM SESSION_ROLES;

ROLE
------------------------------
CONNECT
RESOURCE


启用该用户原来具有的角色,注意:这条SET ROLE语句没有列出HS_ADMIN_ROLE, 它是SELECT_CATALOG_ROLE权限域的一部分。
这是因为Oracle自动启用被授予显示启用的角色的角色。

SQL> set ROLE
2 CONNECT,
3 RESOURCE,
4 SELECT_CATALOG_ROLE,
5 appdev IDENTIFIED By yeTtw;

角色集

SQL> select * from session_roles;

ROLE
------------------------------
APPDEV
CONNECT
RESOURCE
SELECT_CATALOG_ROLE
HS_ADMIN_ROLE

SQL>

######################################################################################

资源限制

表空间定额
ALTER USER lellison
QUOTA 5M ON users;

ALTER USER rlane
QUOTA UNLIMITED ON users;

向用户RLANE授予UNLIMITED TABLESPACE系统权限
GRANT UNLIMITED TABLESPACE TO rlane;


启用资源限制
缺省时,启动数据库不实施资源限制。因此,限制用户访问服务器资源所必需的第一步是启用在实例层强制资源限制。
使用下列格式的SQL命令ALTER SYSTEM, 在不关机和重启Oracle服务的状态下, 可以启用和禁用资源限制的强制实施。

ALTER SYSTEM
SET RESOURCE_LIMIT = {TRUE | FALES}

ALTER SYSTEM
SET RESOURCE_LIMIT = TRUE;


alter system 语句只对当前数据库实例有效,如果打算长期使用资源限制,比阿吉服务器的参数文件使其包含下列参数:
RESOURCE_LIMIT = TRUE

创建新的配置表,使用SQL命令CREATE PROFILE

CREATE PROFILE profile LIMIT
[SESSION_PER_USER { integer | UNLIMITED | DEFAULT}]
[CPU_PER_SESSION { integer | UNLIMITED | DEFAULT}]
[CPU_PER_CALL { integer | UNLIMITED | DEFAULT}]
[CONNECT_TIME { integer | UNLIMITED | DEFAULT}]
[IDLE_TIME { integer | UNLIMITED | DEFAULT}]
[LOGICAL_READS_PER_SESSION { integer | UNLIMITED | DEFAULT}]
[LOGICAL_READS_PER_CALL { integer | UNLIMITED | DEFAULT}]
[COMPOSITE_LIMIT { integer | UNLIMITED | DEFAULT}]
[PRIVATE_SGA { integer | UNLIMITED | DEFAULT}]
[FAILED_LOGIN_ATTEMPTS { integer | UNLIMITED | DEFAULT}]
[PASSWORD_LIFE_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_REUSE_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_REUSE_MAX { integer | UNLIMITED | DEFAULT}]
[PASSWORD_LOCK_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_GRACE_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_VERIFY_FUNCTION {NULL |function |DEFAULT}]

输入以下语句创建新的资源配置表:
CREATE PROFILE appdev LIMIT
SESSIONS_PER_USER 5
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL 3000
CONNECT_TIME UNLIMITED
IDLE_TIME 30
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL 1000
PRIVATE_SGA 200K;

配置表用户可以打开最多5个并发的数据库会话。

配置表用户的会话可以使用无限的CPU时间,但是每个数据库请求只有30秒的CPU时间(设置为3,000个百分之一秒)。如果一个
调用达到了这个CPU极限,那么Oracle就停止这个操作以避免该会话进一步消耗CPU时间。

配置表用户的会话可以不限时间的保持对这个实例的连接,而不必断开连接,但是在自动断开连接之前,只有30分钟的空闲时间。

配置用户的会话可以执行不限次数的逻辑读取(即可以从硬盘也可以从服务器内存中读取数据块),但是每个数据库请求只有1000个
逻辑块的读取操作。如果一个调用达到了这个限制,那么Oracle就停止这个操作以避免这个会话进一步消耗逻辑读取。

使用多线程服务器连接到实例的配置用户会话可以为MTS分配和使用最多200K占用内存。


更改配置表的设置

ALTER PROFILE profile LIMIT
[SESSION_PER_USER { integer | UNLIMITED | DEFAULT}]
[CPU_PER_SESSION { integer | UNLIMITED | DEFAULT}]
[CPU_PER_CALL { integer | UNLIMITED | DEFAULT}]
[CONNECT_TIME { integer | UNLIMITED | DEFAULT}]
[IDLE_TIME { integer | UNLIMITED | DEFAULT}]
[LOGICAL_READS_PER_SESSION { integer | UNLIMITED | DEFAULT}]
[LOGICAL_READS_PER_CALL { integer | UNLIMITED | DEFAULT}]
[COMPOSITE_LIMIT { integer | UNLIMITED | DEFAULT}]
[PRIVATE_SGA { integer | UNLIMITED | DEFAULT}]
[FAILED_LOGIN_ATTEMPTS { integer | UNLIMITED | DEFAULT}]
[PASSWORD_LIFE_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_REUSE_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_REUSE_MAX { integer | UNLIMITED | DEFAULT}]
[PASSWORD_LOCK_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_GRACE_TIME { integer | UNLIMITED | DEFAULT}]
[PASSWORD_VERIFY_FUNCTION {NULL |function |DEFAULT}]




ALTER PROFILE appdev LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1
PASSWORD_LIFE_TIME 30
PASSWORD_GRACE_TIME 5
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED;


配置表用户连续3个登录不成功之后,Oracle自动地锁定该帐号。
如果以为连续3个的失败登录而导致Oracle锁定了配置表用户的帐号,那么Oracle就会保持锁定该帐号整整一天,然后自动解锁帐号。
配置表用户的口令寿命为30天,加上一个个5天的宽限期限,之后,用户必须改变口令,否则Oracle锁定这个帐号。
配置表用户不能重用旧的口令。

Oracle8i强制实施在用户配置表中所设置的全部口令管理特性,无论是否启用带有ALTER SYSTEM 命令或者RESOURCE_LIMIT服务器参数
的资源限制。




######################################################################################


手工强制用户口令终止

要求该用户在下一个会话期间改动这个口令。ALTER USER user PASSWORD EXPIRE

SQL> conn /as sysdba
已连接。
SQL> alter user yzhq
2 password expire;

用户已更改。

SQL> conn yzhq/yzhq
ERROR:
ORA-28001: the password has expired


更改yzhq的口令
新口令:
重新键入新口令:
口令已更改
已连接。
SQL>

######################################################################################

设置用户的配置表


缺省时,所有的用户都分配使用数据库的缺省配置表。为了将用户的配置表设置成另一个配置表,可以使用下列格式的
SQL命令ALTER USER.

ALTER USER user
PROFILE profile


SQL> alter user yzhq profile appdev;

用户已更改。

SQL> conn yzhq
请输入口令:
ERROR:
ORA-01017: invalid username/password; logon denied


警告: 您不再连接到 ORACLE。
SQL> conn yzhq
请输入口令:
ERROR:
ORA-01017: invalid username/password; logon denied


SQL> conn yzhq
请输入口令:
ERROR:
ORA-01017: invalid username/password; logon denied


SQL> conn yzhq
请输入口令:
ERROR:
ORA-28000: the account is locked

######################################################################################

更改缺省数据库的配置表

使用ALTER PROFILE语句可以调整缺省数据库的设置。

禁用缺省数据库配置表的口令管理特性。
ALTER PROFILE default LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL;



######################################################################################

使用口令复杂性检查

可以使用SQL命令CREATE PROFILE和ALTER PROFILE的PASSWORD_VERIFY_FUNCTION参数连检验配置表用户口令的复杂性。

为了启用所有配置表用户的口令复杂性检查,将配置表的PASSWORD_VERIFY_FUNCTION参数设置为一个函数名,这个函数被
用于检查口令的复杂性。Oracle提供了缺省函数,该函数必须用位于$ORACLE_HOME/rdbms/admin/目录中的utlpwdmg.sql
命令脚本来创建。为了运行该脚本,用SYS来连接。


SQL> @$ORACLE_HOME/rdbms/admin/utlpwdmg.sql

函数已创建。


配置文件已更改

SQL>


SQL> create user rhora2 identified by ac;
create user rhora2 identified by ac
*
ERROR 位于第 1 行:
ORA-28003: 指定口令的口令验证失败
ORA-20002: Password length less than 4


SQL> create user rhora2 identified by rhora2;
create user rhora2 identified by rhora2
*
ERROR 位于第 1 行:
ORA-28003: 指定口令的口令验证失败
ORA-20001: Password same as or similar to user


SQL> create user rhora2 identified by welcome;
create user rhora2 identified by welcome
*
ERROR 位于第 1 行:
ORA-28003: 指定口令的口令验证失败
ORA-20002: Password too simple


SQL> create user rhora2 identified by becvx;
create user rhora2 identified by becvx
*
ERROR 位于第 1 行:
ORA-28003: 指定口令的口令验证失败
ORA-20003: Password should contain at least one digit, one character and one
punctuation


SQL> create user rhora2 identified by rmok3h#a;

用户已创建

SQL> drop user rhora2;

用户已丢弃

SQL> create user rhora2 identified by becvx3#;

用户已创建

SQL> alter user rhora2 identified by "becv%3";

用户已更改。



旧口令:becv%3
新口令:becv#9

SQL> conn rhora2
请输入口令:
已连接。
SQL> password
更改RHORA2的口令
旧口令:
新口令:
重新键入新口令:
ERROR:
ORA-28003: 指定口令的口令验证失败
ORA-20004: Password should differ by at \
least 3 characters


口令未更改
SQL>

更改APPDEV配置表以便使用数据库缺省配置表(SYS.VERFY_FUNCTION)的PASSWORD_VERFY_FUNCTION参数。

ALTER PROFILE appdev LIMIT
PASSWORD_VERIFY_FUNCTION DEFAULT;


######################################################################################


显示有关用户的信息

SQL> SELECT username, account_status, default_tablespace, temporary_tablespace, profile
2 FROM dba_users
3 WHERE username IN ('RHORA','RHORA1');

USERNAME ACCOUNT_STATUS
------------------------------ --------------------------------
DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ------------------------------
PROFILE
------------------------------
RHORA1 OPEN
SYSTEM TEMP
DEFAULT


显示有关角色的信息

SQL> select * from dba_roles
2 where role IN ('CONNECT', 'RESOURCE', 'DBA', 'APPDEV');

ROLE PASSWORD
------------------------------ --------
APPDEV YES
DBA NO
RESOURCE NO
CONNECT NO

SQL>

显示有关表空间定额的信息
为了显示在数据库中为每个表空间授予的有关分配额的信息,可以查询DBA_TS_QUOTAS数据字典视图。


SQL> SELECT tablespace_name, username, bytes, max_bytes
2 FROM dba_ts_quotas;

TABLESPACE_NAME USERNAME BYTES MAX_BYTES
------------------------------ ------------------------------ ---------- ----------
CWMLITE OLAPSYS 15663104 -1
STATSPACK PERFSTAT 96206848 -1

SQL>

当用户有无限的表空间定额时,DBA_TS_QUOTAS视图的MAX_BYTES列显示代码"-1"。



显示用户的配置表的信息


SQL> SELECT profile, resource_name, limit
2 FROM dba_profiles
3 WHERE profile = 'APPDEV';

PROFILE RESOURCE_NAME LIMIT
------------------------------ -------------------------------- ----------------------------------------
APPDEV COMPOSITE_LIMIT DEFAULT
APPDEV SESSIONS_PER_USER 5
APPDEV CPU_PER_SESSION UNLIMITED
APPDEV CPU_PER_CALL 3000
APPDEV LOGICAL_READS_PER_SESSION UNLIMITED
APPDEV LOGICAL_READS_PER_CALL 1000
APPDEV IDLE_TIME 30
APPDEV CONNECT_TIME UNLIMITED
APPDEV PRIVATE_SGA 204800
APPDEV FAILED_LOGIN_ATTEMPTS 3
APPDEV PASSWORD_LIFE_TIME 30

PROFILE RESOURCE_NAME LIMIT
------------------------------ -------------------------------- ----------------------------------------
APPDEV PASSWORD_REUSE_TIME UNLIMITED
APPDEV PASSWORD_REUSE_MAX UNLIMITED
APPDEV PASSWORD_VERIFY_FUNCTION DEFAULT
APPDEV PASSWORD_LOCK_TIME 1
APPDEV PASSWORD_GRACE_TIME 5

已选择16行。


SQL>
######################################################################################

你可能感兴趣的:(Oracle)