3. User Account
• User vs. User Account vs. Schema
用户账户包含了登录数据库的验证信息, 包含用户名和密码等.
用户可以理解为一个运行时的概念, 用户通过某个账户登录并创
建会话, 用户与账户的关系是多对一的关系. 模式则是数据库对
象的集合, 属于某个用户账户.
• User Account Attributes
在创建用户账户时, 相关的属性被定义, 这些属性在使用该账户
创建会话时被应用. 包含:
– 用户名
– 验证方法
– 默认表空间
– 表空间配额(tablespace quotas)
– 临时表空间
– 用户配置(User Profile)
– 账户状态
所有属性均可以在创建账户时使用选项指定, 但其中只有用户名
和密码是强制的. 下面逐一介绍这些属性:
4. User Account
– Username
使用CREATE USER语句创建账户, 账户名必须遵循以下规则:
• 使用字母开头, 不能超过30个字符;
• 只能由字母, 数字, $, _等字符组成;
• 不能是保留字, 比如table, index etc.
当使用双引号指定账户名时, 可以绕过这些规则. 示例:
create user “table” identified by abc
用户名被自动转换为大写, 并存储在数据字典表中, 可以通过DBA_USERS查看所有数据库账户. 登录时与大小写无关.
– Default tablespace and quotas
每一个用户账户都有一个默认表空间用户存储与该账户对应的模式对象(表/视图 etc), 创建数据库对象时, 除非指
定了其他表空间, 对象将会存储在默认表空间中. 在创建账户时如果没有指定默认表空间, 那么会使用数据库默认
表空间(如果没有设置则使用SYSTEM, 不推荐), 通过以下方式查询和修改数据库默认表空间:
SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE';
ALERT DATABASE DEFAULT TABLESPACE USERS;
配额是指账户在某个表空间能使用的空间, 如果超过了配额该账户不能在该表空间上创建其
他的任何对象. 使用下面的SQL修改空间配额:
alert user john quota 10m on users;
alert user john quota unlimited on example;
使用以下sql查询表空间配额:
select tablespace_name, bytes, max_bytes from dba_ts_quotas
where username = 'DEMO'
5. User Account
– Temporary Tablespace
数据库会话在执行某些操作时如果pga内存不够则会使用账户相应的临时
表空间进行操作, 临时表空间被所有的账户共享使用.在创建账户时如果
没有指定临时表空间, 那么会使用数据库默认的临时表空间, 通过以下SQL
进行查询:
SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES
WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';
Tip: 无需设置账户在临时表空间上的配额, 因为临时表空间的对象是SYS用
户所有的, 而SYS用户在临时表空间上的配额是unlimited.使用下面的SQL修
改账户的临时表空间:
ALTER USER username TEMPORARY TABLESPACE tablespace_name;
Tip: 如果多个用户使用同一个数据库账户登录, 它们会共享同一个临时表
空间, 这样会带来性能瓶颈. 可以通过临时表空间组来解决这个问题.
– Profile
profile用于控制账户的密码设置和资源使用, 之后会详细介绍.
6. User Account
– Account Status
在一个数据库账户的声明周期中, 可能会处在不同的
状态下, 可以通过DBA_USERS查看账户的状态
(ACCOUNT_STATUS列), 常见的账户状态包括以下:
• OPEN 账户可用
• LOCKED 账户被锁定, 无法连接.
• EXPIRED 账户密码已过期, 账户密码需要被重新设定
• EXPIRED & LOCKED 账户被锁定且密码已经过期
使用以下sql锁定或者解锁一个账户:
ALTER USER username ACCOUNT LOCK ;
ALTER USER username ACCOUNT UNLOCK ;
使用以下sql使迫使用户修改密码:
ALTER USER username PASSWORD EXPIRE;
7. User Account
– Authentication Methods
用户账户必须至少能够通过数据库存储的账户信息进行验证和登
录, 同时oracle还提供了其他的方式如下:
• 操作系统验证
• 密码文件验证(Password file auth)
以上两种方式用于dba用户进行数据库的管理工作, 数据库不需要被打开.
• 密码验证(Password auth)
使用此类验证方式必须保证数据库被打开.
• 外部验证(External auth)
• 全球验证(Global auth)
此验证方式需要安装LDAP服务器.
1, Operating System and Password file Auth
为数据库账户开启操作系统和密码文件验证, 需要授以
该账户SYSDBA或者SYSOPER角色, 使用以 下SQL语句:
grant sysdba|sysoper to username;
8. User Account
1, Operating System and Password file Auth
授以账户这些角色会将该账户的密码从数据字典拷贝到外部密码文
件, 因此即使当数据库没有被打开实例仍然能够通过读取这些文件
对用户进行验证. 密码文件验证使用如下语法:
CONNECT username / password [@db_alias] AS [ SYSOPER | SYSDBA ] ;
操作系统验证使用如下语法, 前提是必须先登录oracle服务器所在的
操作系统,且当前操作系统用户属于ORACLE HOME目录的拥有组, 操
作系统验证无需验证信息:
CONNECT / AS [ SYSOPER | SYSDBA ] ;
2, Password Auth
密码验证用于非SYS用户的普通登录, 此时数据库必须处在OPEN状
态,
使用存储在数据字典中的账户信息进行登录验证. 使用以下SQL语句
修改账户密码:
ALTER USER username IDENTIFIED BY password ;
Tip: 在oracle 11g中, 账户密码是大小写敏感的, 而在之前的版本中密
码大小写不敏感.
9. User Account
- Creating
• 使用CREATE USER语句创建一个账户, 该语句必须指定账户名和验证方式, 其他账户属性
均可以使用默认值, 典型的示例:
create user scott identified by tiger
default tablespace users temporary tablespace temp
quota 100m on users, quota unlimited on example
profile developer_profile
password expire
account unlock;
逐行解释如下:
1, 设置账户名, 验证方式为密码验证; 2, 设置默认表空间和临时表空间;
3, 设置默认表空间以及其它表空间的配额; 4, 设置用户配置项;
5, 设置用户必须立即修改密码; 6, 设置账户可以被使用(默认设置).
所有的这些属性均可以使用ALTER USER语句进行修改, 如下;
alter user scott identified by lion;
alter user scott quota unlimited on store_data, quota 0 on users;
alter user scott profile prod_profile;
alter user scott password expire;
alter user scott account lock;
使用DROP USER语句删除账户, 示例如下:
DROP USER SCOTT;
如果使用scott账户创建了某些对象, 那么必须加上cascade选项, 否则失败:
DROP USER SCOTT CASCADE;
11. Privileges
- System Privileges
• oracle大概有200个系统权限, 大部分对应数据字典的操作, 比如创建
表和用户; 其它的对应实例/数据库的操作, 比如创建表空间, 调整系
统参数或者创建会话等, 下面是常用的权限:
– CREATE SESSION
创建会话, 如果没有此权限用户无法连接数据库.
– RESTRICTED SESSION
如果数据库使用startup restricted或者执行了alter system enable restricted
session, 拥有此权限的用户才可以登录.
– ALTER DATABASE
执行alter database命令的权限.
– ALTER SYSTEM
执行alter system命令的权限.
– CREATE TABLESPACE
创建表空间权限.
– CREATE TABLE
创建表权限.
12. Privileges
- System Privileges
– GRANT ANY OBJECT PRIVILEGE
允许grantee将他们不属于他们的对象的权限授予
其他人, 但不能授予自己.
– CREATE ANY TABLE
grantee能够创建数据其他用户的表, 比如user1执
行下面的SQL:
create table user2.tablename...
– DROP ANY TABLE
grantee可以删除属于其他用户的表.
– INSERT|UPDATE|DELETE ANY TABLE
grantee可以对其他用户的表执行插入,更新和删除.
– SELECT ANY TABLE
grantee可以对数据库内所有的表执行查询.
• 授予系统权限的语法如下: GRANT privilege [, privilege...] TO username ;
可以通过视图DBA_SYS_PRIVS查看系统权限的授予情况.
• 使用下面的语法撤销用户的系统权限: REVOKE privilege [, privilege...] from username;
示例: revoke create table from user1;
Tip: 在授予系统权限时, 如果指定with admin option, 那么grantee可以将该系统权限授予给其他
人, 使用revoke语句撤销系统权限时, 不会递归地将grantee授予给其他人的系统权限撤销;
授予ANY权限通常是一个不好的做法, 尽量避免使用.
13. Privileges
- Object Privileges
• 对象权限涉及到数据库表及相关对象的SELECT, INSERT, UPDATE和DELETE操作, 以及执行
PLSQL过程或者函数. 对象权限是针对不属于当前用户的对象而言的, 比如某个用户创建
了一个table, 那么该用户无需授予权限就就能够对该表执行SELECT和DML操作. 下面是不
同的对象权限以及它们分别作用的对象类型:
• 授予对象权限的语法:
GRANT privilege ON [schema.]object TO username [WITH GRANT OPTION] ;
示例如下:
grant select on store.orders to scott;
grant update (order_status) on store.orders to scott;
grant all on store.regions to scott; -- 使用ALL关键字代表SELECT+DML
• with grant option
当使用此选项授予权限时, grantee可以将权限授予其他人; 与系统权限不同的是, 如果撤
销grantee的权限那么会递归撤销grantee授予其他人的权限.
14. Roles
- Create
• 通过直接操作权限的方式带来了两个问题: 一是巨大的工作量, 这是
显而易见的; 其次是这种方式不能实现如下要求: 权限仅在某些情况
下是可用的. 角色(role)解决了这个问题, 角色是系统权限/对象权限
的集合, 通过一个整体对权限进行授予和撤销操作, 角色可以临时地
激活(activate)或者失效(deactivate).
• Creation
角色并不属于任何用户, 它们与用户名共享相同的命名空间, 角色和
用户名称不能重叠. 使用如下命令创建角色: CREATE ROLE rolename;
可以通过与授予用户权限相同的方式将权限授予给角色, 如下:
create role hr_junior;
grant create session to hr_junior with admin option;
grant select on hr.regions to hr_junior;
授予角色的语法格式如下:
GRANT rolename to username [WITH ADMIN OPTION];
如果指定了with admin option选项, 那么grantee可以将该角色授予其
他的账户. 与系统权限相同, 在撤销grantee的角色时, 如果grantee将
该角色授予了其他账户, 那么不会递归进行撤销.
16. Roles
- Enable & Disable
• 可以通过视图dba_role_privs查看分配给某个账户
的角色, 比如:
select * from dba_role_privs where grantee = 'DEMO‘
结果如右:
需要关注default_role列, 如果一个角色是默认的
那么在创建会话时, 该角色下的所有权限默认被
启用. 通过修改该角色为非默认的, 则会禁用该角
色. 语法如下:
ALTER USER DEMO default role none; -- disable all
ALTER USER DEMO default role connect; -- enable one
ALTER USER DEMO default role RESOURCE, connect; -- enable multiple
24. Database Auditing
• 通过AUDIT_TRAIL实例参数设置基础的数据库审计, 该参数控制审计日志的存放地址, 有以下几个选项:
– NONE(或者FALSE)
禁用基础数据库审计;
– OS
审计记录将写入操作系统文件, 文件目录与DBA审计的目录相同.
– DB
审计记录写入数据字典表SYS.AUD$, 基于该表有相应的视图用于查询.
– DB_EXTENDED
与DB选项相同, 同时包含了SQL语句及其绑定变量.
– XML
与OS相同, 但是用XML格式记录.
– XML_EXTENDED
与XML相同, 同时包含了SQL语句及其绑定变量.
• 配置好AUDIT_TRAIL参数之后, 接下来需要使用audit命令配置具体需要审计的动作, 这些动作可以是: 用户
登录, 系统权限和用户权限的使用, 以及SQL语句的执行. 还可以选择记录成功的动作, 失败的动作或者两
者. 示例:
audit create any trigger; -- 创建触发器
audit select any table by session; -- 审计select语句, by session表示针对一个会话产生一条记
录, 这是默认选项; 还可以指定by access则每次执行select时
会产生一条记录
audit insert on sometable whenever successful; -- 审计执行insert成功的动作, 使用whenever not
successful审计失败的动作
• Views
可以通过DBA_AUDIT_TRAIL视图查询审计记录, 另外
DBA_AUDIT_OBJECT, DBA_AUDIT_STATEMENT, DBA_AUDIT_SESSION是该视图的子视图
25. Value-Based auditing
with triggers
• 基础数据库审计可以记录哪些动作已经发生, 但是无法记录动作相关的具
体内容. 以audit insert on hr.employees为例, 每当一条记录被插入该表时, 会
相应地生成一条审计信息, 但是该信息不会包含插入记录的值. 可以使用基
于触发器的方式对这些动作进行审计以包含相应的值信息. 示例:
CREATE OR REPLACE TRIGGER system.creditrating_audit
AFTER UPDATE OF creditrating ON store.customers
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :old.creditrating != :new.creditrating THEN
INSERT INTO system.creditrating_audit VALUES (sys_context('userenv','os_user'),
sys_context(‘userenv','ip_address'),
:new.customer_id ||' credit rating changed from
'||:old.creditrating|| ' to '||:new.creditrating);
END IF;
END;
/
Tip: 基于数据库触发器的审计方式在效率上比如基础数据库审计, 但是它
提供了额外的信息.