Oracle系统函数
概述:sys_context('userenv','param')函数:通过该函数,可以查询一些重要信息。比如你在使用哪个数据库
说明:1)host:返回数据库所在主机的名称
2)lanuage:语言
3)db_name:当前数据库名称
4)terminal:当前会话客户所对应的终端标识符
5)session_user:当前会话客户所对应的数据库用户名
6)current_schema:当前会话客户所对应的默认方案名
7)nls_date_format:当前会话客户所对应的日期格式
select sys_context('userenv','db_name') from dual; --查询当前所使用的数据库名称 select sys_context('userenv','session_user') from dual; --查询当前在操作数据库的用户 select sys_context('userenv','current_schema') from dual; --查询当前在操作的数据库方案
动态性能视图
用于记录当前例程的活动信息。它的所有者为SYS。一般情况下,由dba或特权用户来查询动态性能视图
当启动Oracle Server时,系统会建立动态性能视图;当停止Oracle Server时,系统会删除动态性能视图
Oracle的所有动态性能视图都是以v_$开始的,并且Oracle为每个动态性能视图都提供了相应的以v$开始的同义词
例如v_$datafile的同义词为v$datafile
数据字典
概述:这是Oracle数据库中最重要的组成部分,它记录了数据库的系统信息,它是只读表和视图的集合,它的所有者为SYS用户
通过查询数据字典可以取得这些系统信息:对象定义情况、对象占用空间大小、列信息、约束信息......
用户只能在数据字典上执行select操作,而其维护和修改是由系统自动完成的
分类:它包括数据字典基表和数据字典动态视图,可以粗略的理解为基表存放静态数据,而动态视图存放动态数据
数据字典基表存储数据库的基本信息,普通用户无法直接访问数据字典的基表
数据字典动态视图是基于数据字典基表所建立的视图,普通用户可以select数据字典动态视图取得系统信息
数据字典动态视图:它主要包括user_xxx、all_xxx、dba_xxx三种类型
在建立用户以及给用户授予权限或角色时,Oracle会把相应的信息存放到数据字典中
通过查询dba_users可以显示所有数据库用户的详细信息
通过查询dba_sys_privs可以显示用户所具有的系统权限
通过查询dba_tab_privs可以显示用户所具有的对象权限
通过查询dba_col_privs可以显示用户所具有的列权限
通过查询dba_role_privs可以显示用户所具有的角色
--user_tables select table_name from user_tables; --用于显示当前用户所拥有的所有表,它只返回用户所对应方案的所有表 --all_tables select table_name from all_tables; --用于显示当前用户可以访问的所有表,它会返回当前用户方案的所有表,以及该用户可以访问的其它方案的表 --dba_tables --它会显示所有方案拥有的数据库表。但查询该数据字典视图,要求用户必须是dba角色或者有select any table系统权限 --比如当system用户查询数据字典视图dba_tables时,会返回system、sys、scott....方案所对应的数据库表 select * from dict where comments like '%grant%'; --显示当前用户可以访问的所有数据字典视图 select * from global_name; --显示当前数据库名称 select tablespace_name from dba_tablespaces; --显示表空间的信息 select file_name,bytes from dba_data_files where tablespace_name='表空间名'; --显示表空间所包含的数据文件 --角色和权限:一个角色可以包含多个权限 select * from dba_roles; --查询Oracle中所有的角色,一般是dba select distinct privilege from dba_tab_privs; --查询Oracle中所有对象权限,一般是dba select * from system_privilege_map order by name; --查询Oracle中所有的系统权限,一般是dba select tablespace_name from dba_tablespaces; --查询数据库的表空间 select * from role_sys_privs where role='CONNECT'; --查询CONNECT角色所具有的系统权限 select * from dba_sys_privs where grantee='CONNECT'; --查询CONNECT角色所具有的系统权限 select * from dba_tab_privs where grantee='CONNECT'; --查询CONNECT角色所具有的对象权限
权限
概述:执行特定类型sql命令或者访问其它方案对象的权利。权限包括系统权限和对象权限两种。
系统权限:用于控制用户可以执行的一个或一组数据库操作
Oracle9i提供了100多种系统权限。而且Oracle版本越高,其提供的系统权限就越多
新建用户没有任何权限,甚至连登录数据库的权限都没有。所以需要为其指定相应的权限
通常由dba或者具有grant any privilege权限的其它用户执行授予操作
授予系统权限时,可以带有with admin option选项,指明被授予的用户或角色还可以将该系统权限授予其它用户或角色
常用的系统权限有如下几种
create session-----------连接数据库
create table-------------用户可在自身方案中建表
create any table---------用户可在任何方案中建表
create view--------------建视图
create procedure--------建过程、函数、包
create trigger------------建触发器
create cluster------------建簇
create public synonym--建同义词
--回收系统权限 --通常由dba来完成,若使用其它用户来回收权限,则要求其具有相应系统权限及转授系统权限的选项(with admin option) grant create session, create table to Michael with admin option; --使用SYSTEM用户为Michael授予权限 grant crate session to Mahone; --使用Michael用户为Mahone授予登录数据库的权限 revoke create session from Michael; --系统权限是不会级联回收的,即此时Mahone还是能够登录数据库的 revoke select on emp from myjava; --回收myjava用户对scott的emp表的查询权限。注意:谁赋的权,就要由谁收回对象权限:指访问其它方案对象的权利。用户可以直接访问自己方案的对象,但要访问别的方案的对象,则必须具有对象的权限
--授予对象权限 --在Oracle9i前,授予对象权限是由对象的所有者或者具有相应的(with grant option)权限的用户来操作的 --从Oracle9i起,dba用户(SYS、SYSTEM)可以将任何对象上的对象权限授予其它用户 --对象权限可以授予用户、角色和public。授予权限时若带有with grant option选项,则可以将该权限转授其它用户 --但是,with grant option选项是不能授予给角色的,它只能授予给用户 grant update on emp(sal) to Michael; --授予Michael用户只可以修改scott.emp表的sal字段的权限 grant alter on emp to Michael; --授予Michael用户修改scott.emp表结构的权限 grant execute on dbms_transaction to Michael; --授予Michael用户执行包dbms_transaction的权限 grant index on scott.emp to Michael; --授予Michael用户可以在scott方案中的emp表上建立索引的权限 --回收对象权限 --对象权限的回收是会被级联回收的 grant connect to myjava with admin option; --如果是系统权限,就加入with admin option grant select on emp to myjava with grant option; --如果是对象权限,就加入with grant option grant select on scott.emp to myjava22; --级联回收机制:若scott回收myjava对emp表的查询权限,那么得到myjava授权的myjava22也会失去select权限
角色
概述:相关权限的命令集合。使用角色的主要目的就是为了简化权限的管理
分类:角色分为预定义角色和自定义角色
预定义角色:指Oracle所提供的角色,每种角色都用于执行一些特定的管理任务。常用的预定义角色有connect、resource、dba
connect:具有应用开发人员需要的大部分权限。多数情况下,只要给新创建的用户授予connect和resource角色就够了
它包含了以下系统权限
alter session、create cluster、create database link、create session、create table、create view、create sequence
resource:具有应用开发人员所需要的其它权限。比如建立存储过程、触发器等。注意该角色隐含了unlimited tablespace系统权限
它包含了以下系统权限
create cluster、create indextype、create table、create sequence、create type、create procedure、create trigger
dba:具有所有的系统权限,以及with admin option选项。默认的dba用户为SYS和SYSTEM,他们可以将任何系统权限授予其它用户
但要注意,dba角色不具备sysdba和sysoper的特权(启动和关闭数据库)
自定义角色:一般由dba或者具有create role系统权限的其它用户来建立。建立角色时,可以指定验证方式,即不验证和数据库验证
1)不验证:如果角色是公用的角色,可以采用不验证的方式建立角色
SQL>create role 角色名 not identified;
2)数据库验证:此时建立角色需要为其提供口令。角色名和口令存放在数据库中。当激活该角色时,必须提供口令
SQL>create role 角色名 identified by 口令;
精细访问控制:指用户可以使用函数、策略实现更加细微的安全访问控制
如果使用精细访问控制,则当在客户端发出SQL语句时,Oracle会自动在SQL语句后面追加谓词(where子句),并执行新的SQL语句
通过这样的控制,可以使得不同的数据库用户在访问相同表时,返回不同的数据信息
--------------------------------------------------------------------------------------------------------------------- --授权角色 --新建立角色时,该角色没有任何权限。为了使得角色能够完成特定任务,必须为其授予相应的系统权限和对象权限 --1)给角色授权和给用户授权没有太多区别,但要注意,系统权限的unlimited tablesapce和对象权限的with grant option选项是不能授予角色的 grant create session to 角色名 with admin option; grant select on scott.emp to 角色名; grant insert,update,delete on scott.emp to 角色名; grant select on emp to myjava; --授权myjava用户可以查询scott的emp表。此时必须是scott或者更高权限如dba方才进行该操作 --此时应该使用select * from scott.emp来查询,否则还是查不到数据 grant all on emp to myjava; --授权myjava用户拥有scott相对于emp表的所有权限,其查询、修改、删除表数据的权限 --2)分配角色给某个用户。通常由dba或具有grant any role系统权限的其它用户来完成 grant 角色名 to Michael with admin option; --授予Michael用户一个角色,且Michael可以将该角色继续授予给其它用户 grant resource to myjava; --授权myjava用户可在任意表空间下建表 grant connect to myjava; --授权myjava用户拥有登录权限 grant dba to myjava; --授权myjava用户拥有DBA权限 --------------------------------------------------------------------------------------------------------------------- --删除角色:使用drop role命令。通常由dba或具有drop any role系统权限的其它用户来执行 drop role 角色名; --此时该角色所被授予的用户,将同时会失去该角色所包含的权限 --------------------------------------------------------------------------------------------------------------------- --显示角色 --当以用户的身份连接到数据库时,Oracle会自动激活默认的角色 --通过dba_role_privs可以显示某个用户具有的所有角色以及当前默认的角色 select * from dba_role_privs where grantee='用户名'; --显示某个用户具有的所有角色以及当前默认的角色 select * from dba_roles; --显示所有角色,包括预定义和自定义的角色 select * from role_sys_privs where role='角色名' --显示角色所具有的系统权限 select * from dba_tab_privs where grantee='角色名'; --显示角色所具有的对象权限 ---------------------------------------------------------------------------------------------------------------------
数据库表的逻辑备份与恢复
逻辑备份:使用工具export将数据对象的结构和数据导出到文件的过程
逻辑恢复:当数据库对象被误操作而损坏后,使用工具import利用备份的文件把数据对象导入到数据库的过程
物理备份可在数据库open的状态下进行,也可在关闭数据库后进行,但逻辑备份与恢复只能在open的状态下进行
导出:具体分为导出表、导出方案、导出数据库三种方式。导出使用exp命令来完成,该命令常用的选项如下
userid---用于指定执行导出操作的用户名、口令、连接字符串
tables---用于指定执行导出操作的表
owner----用于指定执行导出操作的方案
full=y---用于指定执行导出操作的数据库
inctype--用于指定执行导出操作的增量类型
rows-----用于指定执行导出操作是否要导出表中的数据
file-----用于指定导出的文件名
--------------------------------------------------------------------------------------------------------------------- --导出表 --导出自己的表 exp userid=scott/hongyu@jadyer tables=(emp,dept) file=d:\table_emp_dept.dmp --导出其它方案的表:此时该用户需要dba权限或者exp_full_database权限,比如system用户就可导出scott的表 exp userid=system/manager@jadyer tables=(scott.emp) file=d:\table_emp.dmp --导出表的结构 exp userid=scott/hongyu@jadyer tables=(emp) file=d:\structure_emp.dmp rows=n --直接导出方式 --这种方式比默认的常规方式速度要快。当数据量大时,可以考虑使用这种方法 --这时需要数据库的字符集要与客户端字符集完全一致,否则会报错。。。 exp userid=scott/hongyu@jadyer tables=(emp) file=d:\data_emp.dmp direct=y --------------------------------------------------------------------------------------------------------------------- --导出方案 --指使用export工具导出一个方案或者多个方案中的所有对象(表、索引、约束等等)和数据,并存放到文件中 --导出自己的方案 exp userid=scott/hongyu@jadyer owner=scott file=d:\schema_scott.dmp --导出其它的方案:此时该用户需要dba权限或者exp_full_database权限,比如system用户就可以导出任何方案 exp userid=system/manager@jadyer owner=(system,scott) file=d:\schema_system_scott.dmp --------------------------------------------------------------------------------------------------------------------- --导出数据库 --利用export工具导出数据库中的对象及数据,要求该用户具有dba权限或者exp_full_database权限 exp userid=system/manager@jadyer full=y inctype=complete file=d:\database_bak.dmp ---------------------------------------------------------------------------------------------------------------------导入:使用工具import将文件中的对象和数据导入到数据库中。 但导入的文件必须是export所导出的文件
--------------------------------------------------------------------------------------------------------------------- --导入表 --导入自己的表 imp userid=scott/hongyu@jadyer tables=(emp) file=d:\table_emp.dmp --导入表到其它用户:此时要求该用户具有dba或者imp_full_database权限 imp userid=system/manager@jadyer tables=(emp) file=d:\table_emp touser=scott --导入表的结构:只导入表的结构,而不导入数据 imp userid=scott/hongyu@jadyer tables=(emp) file=d:\table_emp rows=n --导入数据:如果对象(比如表)已经存在,可以只导入表的数据 imp userid=scott/hongyu@jadyer tables=(emp) file=d:\table_emp ignore=y --------------------------------------------------------------------------------------------------------------------- --导入方案 --使用import工具将文件中的对象和数据导入到一个或者多个方案中 --若要导入其它方案,则要求该用户具有dba或者imp_full_database权限 --导入自身的方案 imp userid=scott/hongyu file=d:\schema_scott.dmp --导入其它的方案 imp userid=system/manager file=d:\schema_system.dmp fromuser=system touser=scott --------------------------------------------------------------------------------------------------------------------- --导入数据库 --默认情况下,会导入所有对象结构和数据。此时甚至连实例都不用指定,它会自动创建一个实例 imp userid=system/manager full=y file=d:\database_bak.dmp ---------------------------------------------------------------------------------------------------------------------