sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限。
system用户是管理操作员,权限也很大,具有susoper角色,没有create database的权限。
一般来讲,对于数据库维护,使用system用户登录就可以。
scott用户默认密码tiger,默认是锁定的,可以从PS/SQL中解锁
连接到scott:
conn scott/tiger
修改当前用户密码:
passw
显示当前用户名:
show user
断开当前链接:
disc
退出:
exit
运行sql脚本:
start d:\a.sql
或
@ d:\a.sql
编辑sql脚本:
edit d:\a.sql
将SQL Plus屏幕上的内容输出到指定文件中
spool d:\b.sql
并输入
spool off
select * from scott.emp where ename = '&name';
//弹出对话框提示输入查询字符串
SQL Plus中设置linesize和pagesize
set linesize 90 show linesize set pagesize 15 show pagesize
Oracle用户管理
Oracle 11g sys,system 密码忘记设置解决办法
1.启动sqlplus
2.请输入用户名: sqlplus/as sysdba
3.输入口令: 直接回车
4.连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>alter user sys identified by admin;
用户已更改。
SQL> conn sys/admin as sysdba;
已连接。
SQL> alter user system identified by manager;
用户已更改。
创建用户:create user,具有dba权限才能使用
create user umgsai identified by 123456;
//提示权限不足
system用户登录之后会提示创建成功。新创建的用户没有任何权限,不能登录数据库。用system或sys用户给新建的用户赋权限。
grant connect to umgsai;
(connect其实是一种预定义角色)
dba角色权限很高,包含connect角色的权限,不可以随便授权。
resource角色可以使用户在任何表空间建表。
password umgsai;
//给新建的用户修改密码
权限:系统权限&对象权限
系统权限:用户对数据库的相关权限(建库 建表 建索性 存储过程 登录 修改密码)
对象权限:用户对其他用户的数据对象操作的权限
数据对象:表、视图、存储过程、触发器等。
未给新建的用户赋create table权限,用户不可以建表。
用system用户给新建的用户授权
grant resource to umgsai;
//提示授权成功
create table test(id int, username varchar(30));
提示表已创建
可以看表结构
desc test;
对象权限:select、 insert、 update、 delete、 all、 create index。
all表示当前表的所有的操作权限
grant select on emp to umgsai;
//授权指定权限给用户umgsai。(emp表是scott用户的,system、sys、scott用户可以进行此授权)
将scott用户的emp表的select权限授给umgsai后,用umgsai用户登录,可以对emp表进行select操作。
select * from scott.emp;
//可以执行成功
revoke select on emp from umgsai;
//从umgsai收回对emp表的select权限。
drop user umgsai;
//删除用户
如果要删除的用户已经创建了表,则在删除时要带一个参数cascade,将用户及该用户创建的表都删除掉。
password scott
给scott用户修改密码
如果是对象权限,在后面加上with grant option可以使用户可以把权限赋给别人
如果scott给umgsai这么赋权限
grant select on emp to umgsai with grant option;
则umgsai可以把对emp表的select权限赋给下一个新用户
如果收回umgsai对emp表的select权限,那么被umgsai赋权限的用户也将丢失对emp表的select权限。
如果是系统权限,在后面加上with admin option
如果system给umgsai这么赋权限
grant connect to umgsai with admin option
那么umgsai可以把connect权限赋给下一个新用户
指定scott用户最多只能尝试3次登录,否则锁定,锁定时间为2天。(需要DBA身份)
create profile lock_account limit failed_login_attempts 3 password_lock_time 2; alter user scott profile lock_account;
若已锁定,用下面语句解锁。
alter user scott account unlock;
指定scott用户每隔10天修改一次登录密码,宽限期为2天。(需要DBA身份)
create profile myprofile limit password_life_time 10 password_grace_time 2; alter user scott profile myprofile;
若已锁定,用下面语句解锁。
alter user scott account unlock;
如果希望用户在修改密码时,不能使用以前使用过的密码,可以使用口令历史,这样oracle就会将口令修改的信息存放在数据字典中,当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密码。
create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10;
//指定口令可重用时间即10天后就可以重用。
当不需要某个profile文件时,可以删除文件
drop profile password_history (cascade)
Oracle表管理
添加一个字段:
alter table student add(class number(2));
修改字段长度:
alter table student modify (xm varchar2(30));
修改字段类型或名字(不能有数据):
alter table student modify(xm char(30));
删除一个字段:
altertable student drop colunm sal;
修改表的名字:
rename student to stu;
删除表:
drop table student;
更改默认日期格式:
alter session set nls_date_format='yyyy-mm-dd'
删除数据:
delete from student
(删除所有记录,表结构还在,写日志可以回复,速度慢)
删除表:
drop table student
(结构和数据都删除)
删除表中所有数据:
truncate table student;
(表结构还在,不写日志,无法找回删除的记录,速度快)
创建一个回滚记录点:
savepoint a;
若后面删除了记录,可以回滚到记录点。命令:
rollbackto a;
显示操作时间:
set timing on;
使用列的别名
select ename "姓名",sal*12 as "年收入"fromemp;
空值处理
select sal*13 + nvl(comm,0)*13 "年工资",ename,comm from emp;
(若comm为null,则用0代替)
连接字符串
select ename || 'is a 'job from emp;
空值判断
select * from emp where mgr is null;
分组查询group by:
select avg(sal), max(sal), depno from emp group bydepno;
按两个字段分组:
selectavg(sal), max(sal), depno, job from emp group by depno, job;
having语句:
select avg(sal), max(sal),depno from emp group by depno having avg(sal) > 2000;
(平均工资低于2000的部门号和他们的平均工资)
从emp表中选出3个字段创建新的表,并且导入emp表中的数据
create tablemyemp (id, ename, sal) as select empno, ename, sal from emp;
union用于取得两个结果集的并集,会自动去掉结果集中重复行
select ename,sal, job from emp where sal > 2500 union select ename, sal, job from empwhere job = 'manager';
unionall 与union相似,但是不会去掉重复行,不会排序.
select ename,sal, job from emp where sal > 2500 union all select ename, sal, job from empwhere job = 'manager';
intersect用于取两个集合的交集
select ename,sal, job from emp where sal > 2500 intersect select ename, sal, job from empwhere job = 'manager';
minus用于取两个集合的差集,显示存在于第一个集合中不存在与第二个集合中的数据
select ename,sal, job from emp where sal > 2500 minus select ename, sal, job from empwhere job = 'manager';
to_date函数:
to_date('2014-07-30','yyyy-mm-dd')
在insert语句中使用
从一张表中查出部分数据插入到另外一张表中:
insertinto emp1(id, myname, mydept) select empno, ename, depno from emp;
设置umgsai用户的job、sal、comm和smith用户一样
updateemp set (job, sal, comm) = (select job, sal, comm) from emp where ename = 'smith'where ename = 'umgsai'
可以创建保存点备用。
savepointa;
回滚:
rollback to a;
保存点的个数不限。
执行提交命令 commit 提交事务,删除保存点,释放锁,其他绘画可以看到事物提交之后的数据。执行exit命令之后自动commit。
只读事务:
settransaction read only
只允许执行查询操作,不允许其他的create、delete、update操作。确保用户只取得某时间点的数据。
Eg.机票代售点每天18点开始统计几天的销售情况,这时可以使用只读事务。设置只读事务后,尽管其他会话可能会提交新的事物,但是只读事务将不会取得新的数据的变化,从而可以保证取得特定时间点的数据信息。
Oracle字符函数
lower(char)将字符串转化成小写
upper(char)将字符串转化成大写
length(char)返回字符串的长度
substr(char,m,n)取字符串的子串
查询首字母大写其他字母小写
selectupper(substr(ename,1,1))||lower(substr(ename,2,length(ename)-1))from scott.emp
replace函数 select replace(ename,'A','B')from emp;//把ename中的A替换成B
数学函数:
round四舍五入
trunc截取数字
mod
floor向下取整
ceil向上取整
abs绝对值
acos反余弦
asin反正弦
atan反正切
cos余弦
exp返回e的n次幂
log对数
power(m,n)返回m的n次幂
日期函数
默认格式dd-mm-yy
sysdate返回系统时间
select sysdate from emp;
add_months(d,n)返回当前日期n个月之后的日期
select add_months(sysdate,2) from emp;
last_day(d)返回指定日期所在月份最后一天
select last_day(sysdate) from emp;
to_char转换函数
select to_char(sal,'L99,999.99')from emp;
//显示为¥3,000.00
取日期的年份
select to_char(hiredate,'yyyy')from emp;
系统函数
terminal当前会话客户所对应的终端的标识符
select sys_context('userenv',' terminal')from emp;
language语言
select sys_context('userenv','language')from emp;
db_name当前数据库名称
select sys_context('userenv','db_name')from emp;
nls_date_format当前会话客户所对应的日期格式
select sys_context('userenv','language')from emp;
session_user当前会话客户所对应的数据库用户名
select sys_context('userenv','session_user')from emp;
host数据库所对应的主机名称
select sys_context('userenv','host')from emp;
current_schema当前会话客户所对应的默认方案名
select sys_context('userenv','current_schema')from emp;
数据库管理员职责
① 安装和升级Oracle数据库
② 建库、表空间、表、视图、索引…
③ 指定并实施备份与恢复计划
④ 数据库权限管理,调优,故障排除
⑤ 对于高级DBA,要求能参与项目开发,会编写SQL语句、存储过程、触发器、规则、约束、包
管理数据库的用户主要是sys和system,区别:
① 存储的数据的重要性不同
sys:所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己维护,任何用户都不能手动更改。Sys用户拥有dba、sysdba、sysoper角色或权限,是oracle权限最高的用户。
System:用户存放次一级的内部数据,如oracle的一些特性或工具的管理信息。System用户拥有dba、sysdba角色或系统权限.
② 权限不同
Sys用户必须以as sysdba或as sysoper形式登陆.不能以normal方式登陆数据库.
System如果可以正常登陆,它其实就是一个普通的dba用户,但是如果以as sysdba登陆,其结果实际上它是作为sys用户登录的,从登录信息里面我们可以看出来.
权限 sysdba> sysoper > dba
管理初始化参数
显示初始化参数
show parameter
数据库(表)的逻辑备份与恢复
逻辑备份:使用工具export将数据对象的结构和数据导出到文件。
逻辑恢复:当前数据库对象被误操作而损坏后使用工具import利用备份文件把数据对象导入到数据库的过程。
物理备份既可以在数据库open的状态下进行也可以在关闭数据库之后进行,但是逻辑备份和恢复只能在open的状态下进行。
导出:导出表、导出方案、导出数据库
(cmd进入oracle安装目录下的bin目录)
命令选项:
userid 执行导出操作的用户名、口令、连接字符串
tables要导出的表
owner 执行导出操作的方案
full=y 执行导出操作的数据库
inctype 执行导出操作的增量类型
rows 执行导出操作是否要导出表中的数据
file 导出文件名
导出表:
① 导出自己的表
exp userid=scott/tiger@myoral tables=(emp,dept) file=d:\e1.dmp
② 导出其他方案的表,需要dba权限或是exp_full_database的权限
exp userid=system/manager@myoral tables=(scott.emp) file=d:\e1.dmp
(system导出scott的表)
③ 导出表结构
exp userid=scott/tiger@accp tables=(emp) file=d:\e3.dmp rows=n
④ 使用直接导出方式
exp userid=scott/tiger@accp tables=(emp) file=d:\e3.dmp direct=y
(这种方式比默认的常规方式速度要快,当数据量大时使用这种方法。需要数据库的字符集与客户端字符集完全一致,否则报错)
导出方案:使用export工具导出一个方案或是多个方案中的所有对象(表、索引、约束…)和数据,并存放到文件中。
① 导出自己的方案
exp scott/tiger@myoral owner=scott file=d:\scott.dmp
② 导出其他方案(需要dba的权限或是exp_full_database的权限,system用户可以导出任何方案)
exp system/manager@myoral owner=(system,scott) file=d:\system.dmp
导出数据库:利用export导出所有数据库中的对象及数据。要求该用户具有dba的权限或是exp_full_database权限.(数据量大,一般耗时较长)
expuserid=system/manager@myoral full=y inctype=complete file=d:\x.dmp
导入:导入表、导入方案、导入数据库
用import将文件中的对象和数据导入到数据库中,但是导入要使用的文件必须是export所导出的文件。(cmd进入oracle安装目录下的bin目录)
命令选项:
userid 执行导入操作的用户名、口令、连接字符串
tables 要导入的表
fromuser 指定源用户
touser 指定目标用户
file 指定导入文件名
full=y 指定执行导入整个文件
inctype 执行导入操作的增量类型
rows 指定是否要导入表行(数据)
ignore 如果表存在,则只导入数据
导入表:
① 导入自己的表
imp userid=scott/tiger@myoral tables=(emp) file=d:\e1.dmp
② 导入表到其他用户,要求该用户具有dba权限,或是imp_full_database
imp userid=system/manager@myoraltables=(emp) file=d:\e1.dmp touser=scott
③ 导入表结构(不导入数据)
imp userid=scott/tiger@accp tables=(emp) file=d:\e3.dmp rows=n
④ 导入数据
imp userid=scott/tiger@accp tables=(emp) file=d:\e3.dmp ignore=y
(这种方式比默认的常规方式速度要快,当数据量大时使用这种方法。需要数据库的字符集与客户端字符集完全一致,否则报错)
导出方案:使用export工具导出一个方案或是多个方案中的所有对象(表、索引、约束…)和数据,并存放到文件中。
① 导出自己的方案
exp scott/tiger@myoral owner=scott file=d:\scott.dmp
② 导出其他方案(需要dba的权限或是exp_full_database的权限,system用户可以导出任何方案)
exp system/manager@myoral owner=(system,scott) file=d:\system.dmp
导出数据库:利用export导出所有数据库中的对象及数据。要求该用户具有dba的权限或是exp_full_database权限.(数据量大,一般耗时较长)
exp userid=system/manager@myoral full=y inctype=complete file=d:\x.dmp
数据字典:提供数据库的一些系统信息,是只读表和视图的集合,数据字典的所有者为sys用户。用户只能在数据字典上执行查询(select)操作,其维护和修改由系统自动完成。
数据字典包括数据字典基表和数据字典视图。基表存储数据库的基本信息,普通用户不能直接访问基表。数据字典视图是基于数据字典基表所建立的视图,普通用户可以通过查询数据字典视图取得系统信息。数据字典视图主要包括user_xxx,all_xxx,dba_xxx三种类型。
动态性能视图:记载例程启动后的相关信息。
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…方案所对应的数据库表。
用户名 & 权限 & 角色
在建立用户时,oracle会把用户的信息存放到字典中,当给用户授予权限或是角色时,oracle会将权限和角色的信息存放到数据字典。
查询dba_users可以显示所有数据库用户的详细信息
desc dba_users;
查询数据字典视图dba_sys_privs可以显示用户具有的系统权限
查询数据字典视图dba_tab_privs可以显示用户具有的对象权限
查询数据字典dba_col_privs可以显示用户具有的列权限
查询数据库字典视图dba_role_privs可以显示用户所具有的角色
查询角色包含的系统权限
Select * from dba_sys_privs where grantee='CONNECT' Select * from role_sys_privs where role='CONNECT'
查询一个角色包含的对象权限
Select * from dba_tab_privs where grantee = 'CONNECT'
查询Oracle的角色
Select * from dba_roles;
查询某个用户具有的角色
Select * from dba_role_privs where grantee = 'username'
显示当前用户可以访问的所有数据字典视图
Select * from dict where comments like '%grant%'
显示当前数据库的全称
Select * from global_name;
表空间:数据库的逻辑组成部分。从物理上讲,数据库数据存放在数据文件中;从逻辑上讲,数据库则是存放在表空间中,表空间由一个或是多个数据文件组成。
数据库由表空间构成,表空间由段构成,段由区构成,区由Oracle块构成。表空间用于从逻辑上组织数据库的数据。数据库逻辑上是由一个或是多个表空间组成的,通过表空间可以达到以下作用:
① 控制数据库占用的磁盘空间
② DBA可以将不用数据类型部署到不同的位置,这样有利于提高I/O性能,同时有利于备份和恢复等管理操作。
建立表空间是特权用户或是DBA来执行的,必须具有create tablespace权限。
建立数据库后,为便于管理表,最好建立自己的表空间
Create tablespace data01 datafile 'd:\test\data01.dbf' size 20m uniform size 128k
建立名称为data01的表空间,并未该表空间建立名称为data01.dbf的数据文件,区的大小为128k
使用数据表空间
Create table mypart (depno number(4), dname varchar2(14)) tablespace data01;
当建立表空间时,表空间处于联机(online)状态,此时表空间是可以访问的,并且该表空间是可以读写的,即可以查询该表空间的数据,而且还可以在表空间执行各种语句。但是在进行系统维护或是数据维护时,可能需要改变表空间的状态。一般情况下,由特权用户或是DBA来操作。
① 使表空间脱机(不可用)
Alter tablespace users offline;
② 使表空间联机
Alter tablespace users online;
③ 只读表空间
Alter tablespace users readonly; Alter tablespace users read writte;--(设置表空间可读、可写)
④ 显示表空间包括的所有的表
Select * from all_tables where tablespace_name = 'USERS'
⑤ 查询某个表所属的表空间
Select tablespace_name,table_name from user_tables where table_name = 'EMP'
(系统表空间不可改为只读);
⑥ 删除表空间
Drop tablespace 'users' including contents and datafiles;
(includingcontents表示删除表空间时也删除该空间所有的数据库对象,datafiles表示将数据库文件也删除)
⑦ 扩展表空间
表空间是由数据文件组成的,表空间的大小实际上就是数据文件相加后的小大小。如果数据文件的大小大于表空间的大小,就会显示空间不足。扩展表空间三种方法:
1. 增加数据文件
Alter tablespace sp01 add datafile 'd:\test\sp01.dbf' size 20m
2. 增加数据文件大小
Alter tablespace datafile 'd:\test\sp01.dbf' resize 20m
3. 设置文件的自动增长
Alter tablespace datafile 'd:\test\sp01.dbf' autoextend on next 10m maxsize 500m
⑧ 移动数据文件
如果数据文件所在的磁盘损坏,该数据文件将不能再被使用。为了能够重新使用,需要将这些文件的副本移动到其它的磁盘,然后恢复。
Eg.例
Step1 确定数据文件所在的表空间
Select tablespace_name from dba_data_files where file_name = 'd:\sp001.dbf';
Step2 使表空间脱机(确保数据文件一致性,将表空间转变为offline状态)
Alter tablespace sp01 offline;
Step3 使用命令移动数据文件到指定的目标位置
Host move d:\sp001.dbfc:\sp001.dbf
Step4 执行alter tablespace命令
在物理上移动了数据后,还必须执行alter tablespace命令对数据文件进行逻辑修改
Alter tablespace sp01 rename datafile 'd:\test\sp01.dbf'to 'c:\test\sp01.dbf';
Step5 使表空间联机
在移动了数据文件后,为了使用户可以访问该表空间,必须将其转变为online状态。
Alter tablespace data01 online;
⑨ 显示表空间信息
查询数据字典视图dba_tablespaces,显示表空间的信息
Select tablespace_name from dba_tablespces;
⑩ 显示表空间所包含的数据文件
查询数据字典视图dba_data_files,可以显示表空间所包含的数据文件
Select file_name,bytes from dba_data_files where tablespace_name = 'USERS'
其他类型的表空间
(1) 索引表空间
(2) Undo表空间
(3) 临时表空间
(4) 非标准块的表空间
维护数据库的完整性
约束:确保数据库数据满足特定的规则。(not null、unique、primarykey、foreignkey、check)
Check用法
price number(10,2) check(price>0); sex char(2) default '男'check(sex in ('男','女')); nums number(10) check(nums between1 and 30);
references用法
customerId char(8) references customer(customerId);
修改表结构
Alter table goods modify goodsname not null;--修改goodsname不为空 Alter table customer add constraint cardunique unique(cardId);--修改cardId为唯一约束 Alter table customer add constraint addresscheck check(address in('东城','西城'));--添加check约束
删除约束
alter table tablename drop constraint constraintname;
删除主键的时候,可能有错误,因为有外检约束。例如
Alter table tablename drop primary key;
这时必须带上cascade选项
Alter table tablename drop primary key cascade;
显示约束信息
Select constraint_name,constraint_type, status, validated from user_constraints where table_name = 'tablename';
显示约束列
Select colum_name, position fromuser_cons_colums where constraint_name = 'constraintname'
列级定义:在定义列的同时定义约束
表级约束:在定义了所有的列之后再定义约束。Not null约束只能在列级上定义。
索引:用户加快数据存取的数据对象。合理地使用索引可以大大降低I/O次数,从而提高数据访问性能。
单列索引:基于单个列所建立的索引
Create index indexname on tablename(columname)
复合索引:基于两列或是多列的索引。在同一张表上可以有多个索引,但是要求列的组合必须不同。
Create index emp_idx1 on emp(ename,job);
Create index emp_idx1 on emp(job,ename);
使用原则:
① 在大表上建立索引才有意义
② 在where字句或是连接条件上经常引用的列上建立索引
③ 索引的层次不要超过4层
索引的缺点
① 建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引。
② 更新数据的时候,系统要对索引进行更新以维持数据和索引的一致性。不恰当的索引会降低系统性能。因为大量的索引在进行插入、修改和删除操作时比没有索引花费更多的系统时间。
索引分类:
按存储方式分:B*树、反向索引、位图索引
按索引列的个数分:单列索引、复合索引
按索引列值的唯一性分:唯一索引、非唯一索引
此外还有 函数索引、全局索引、分区所引
B*树索引建立在重复值很少的列上,而位图索引则建立在重复值很多、不同值相对固定的列上。
显示表的所有索引:
Select index_name, index_type from user_indexes where table_name = 'table_name';
显示索引列
Select table_name,column_name from user_ind_columns where index_name = 'IND_ENAME';
管理权限和角色
当刚刚建立用户时,用户没有任何权限,也不能执行任何操作。如果要执行某种特定的数据库操作,则必须为其授予系统的权限。如果用户要访问其他方案的表,则必须为其授予对象权限。为了简化权限的管理,可以使用角色。
系统权限:执行特定类型的SQL命令。用于控制用户可以执行的一个或是一组数据库操作。
常用:
Create session 连接数据库
Create table 建表
Create view建视图
Create public synonym 建同义词
Create procedure 建过程、函数、包
Create trigger 建触发器
Create cluster 建簇
显示系统权限
Oracle提供了100多系统权限。而且Oracle的版本越高,提供的系统权限就越多。
Select * from system_privilege_map order by name;
授予系统权限
一般情况下,授予系统权限是由DBA完成的。如果其他用户来授予系统权限,则要求用户必须有grant any privilege的系统权限。在授予系统权限时,可以带有withadmin option选项,表示被授予权限的用户或是角色还可以将该系统权限授予其他的用户或角色。
回收系统权限
一般回收系统权限由DBA来完成。其他用户必须具有相应系统权限及转授系统权限的选项(with admin option)。系统权限回收时不级联。
对象权限:访问其他方案对象的权利。用户可以直接访问自己方案的对象,但是如果要访问别的方案的对象,则必须具有对象的权限。
常用:
Alter 修改
Delete 删除
Select查询
Insert添加
Update修改
Index索引
References引用
Execute执行
显示对象权限
Select distinct privilege fromdba_tab_privs;
Select grantor, owner, tnle_name,privilege from dba_tab_privs where grantee = 'BLAKE';
授予列权限
Grant update on emp(sal) to monkey;--monkey用户只可以修改emp表的sal字段
授予alter权限
Grant alter on emp to blake;--blake用户可以修改表结构
授予execute权限
Grant execute on dbms_transactionto ken;--ken可以执行dbms_transaction
授予index权限
Grant index on scott.emp toblake;--blake可以在scott.emp表上建立索引
回收对象权限(由对象所有者或者dba用户完成)
收回对象权限后,用户不能执行相应的SQL操作,对象的权限会级联回收。
Revoke select on emp from blake;
角色:相关的权限的命令集合。使用角色是为了简化权限的管理。(预定义角色&自定义角色)
预定义角色-connect:altersession、create cluster、create database link、create session、create table、create view、create sequence
预定义角色-resource:createcluster、create indextype、create table、create sequence、create type、create procedure、create trigger
预定义角色-DBA:具有所有系统权限。默认DBA用户为sys用户和system用户。DBA角色不具备sysdba、sysoper的权限(启动和关闭数据库)
自定义角色:根据自己的需要来定义,一般是DBA来建立,如果是别的用户来建立,则需要 create role权限。建立角色时可以指定验证方式(不验证&数据库验证等)
① 建立角色(不验证)
如果是公用角色,可以采用不验证的方式建立角色
Create role rolename notidentified;
② 建立角色(数据库验证)
采用这种方式时,角色名和口令存放在数据库中。当激活该角色时,必须提供口令。在建立这种角色时,需要为其提供口令。
Create role rolename identified by umgsai;
角色授权:当建立角色时,角色没有任何权限,必须为其授予相应的系统权限和对象权限。
① 给角色授权
给角色授予权限和给用户授权没有太多区别。但是系统权限的unlimited tablespace和对象权限的with grant option选项是不能授予角色的。
Grant create session torolename with admin option;--授权
Grant insert,update,deleteon scott.emp to rolename;
② 分配角色给某个用户
一般由DBA完成。其他用户必须要有grant any role权限才可以。
Grant rolename to blakewith admin option;
③ 删除角色
一般由DBA来完成,其他用户必须具有drop any role权限才可以。
Drop role rolename;
④ 显示所有角色
Select * from dba_roles;
⑤ 显示角色所具有的系统权限
Select privilege,admin_option from role_sys_privs where role = 'rolename'
⑥ 显示角色所具有的对象权限
通过查询数据字典视图dba_tab_privs可以查看角色具有的对象权限或是列的权限
⑦ 显示用户具有的角色,及默认角色
当以用户的身份连接到数据库时,oracle会自动激活默认角色,通过查询数据字典视图dba_role_privs可以显示某个用户具有的所有角色及当前默认的角色。
Select granted_role,default_role from dba_role_privs where grantee = '用户名'
PL/SQL
PL/SQL(procedure language/sql)是oracle在标准的sql语言上的扩展。PL\SQL不仅允许嵌入SQL语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种异常。
编写规范:
单行注释 --
多行注释 /*************/
定义变量,用v_作为前缀 v_sal
定义常量,用c_作为前缀 c_rate
定义游标,用 _cursor作为后缀 emp_cursor
定义异常,用 _error作为后缀 e_error
示例
Create or replace procedure pro1 is Begin Insert into user values('admin','admin'); End;
显示错误信息
show error;
执行存储过程
exec pro1;
PL/SQL块由三个部分构成:定义部分、执行部分、异常处理部分
declare /*定义部分:常量、变量、游标、异常、复杂数据类型*/ begin /*要执行的PL/SQL语句和SQL语句*/ exception /*异常处理部分*/ end;
示例
set serveroutput on�C打开输出选项 begin dbms_output.put_line('Hello world'); end; /
示例
declare v_ename varchar2(5);--定义一个字符串变量 v_sal number(7,2);--定义一个字符串变量 begin select ename,sal intov_ename,v_sal fromSCOTT.emp where empno =&no;--no从控制台输入 dbms_output.put_line('雇员名:'||v_ename); exception when no_data_found then dbms_output.put_line('输入的编号有误'); end; /
示例(带参数的存储过程)
Create procedure pro(v_namevarchar2,v_salnumber)is Begin Update SCOTT.emp set sal =v_sal where ename =v_name; End; /
Exec pro('admin',4568);--执行存储过程
在Java中调用上面的存储过程
CallableStatement cs = connection.prepareCall(“{call pro(?,?)}”); cs.setString(1,”SMITH”); cs.setInt(2,10000); cs.execute(); cs.close();
函数
create function fun(v_name varchar2) return number is my_sal number(7,2); begin select sal*12 into my_sal from SCOTT.emp where ename = v_name; return my_sal; end; --在SQLPlus中调用函数 var income number call fun('SCOTT')into:income; print income
包
创建包
create package my_package is procedure update_sal(name varchar2,newsal number); function annual_income(name varchar2)return number; end; /
创建包体
create package body my_package is procedure update_sal(name varchar2,newsal number) is begin update SCOTT.emp set sal =newsal where ename =name; end; function annual_income(name varchar2) return number is annual_salary number; begin select sal*12 intoa nnual_salary from SCOTT.emp where ename =name; return annual_salary; end; end; /
调用包的过程或是函数
call my_package.update_sal('SCOTT',1500);
定义并使用变量
① 标量类型(scalar)
变长字符串 v_ename varchar2(10);
小数(范围 -9999.99-9999.99) v_sal number(6,2);
定义一个小数并赋初值 v_sal2 number(6,2):=5.4 ( := 表示赋值)
日期类型 v_hiredate date;
布尔类型 v_valid boolean not null default false;
标量使用案例(%type的使用)
declare c_tax_rate number(3,2):=0.03; v_name varchar2(5); v_sal scott.emp.sal%type; v_tax_sal number(7,2); begin select ename,sal intov_name, v_sal from SCOTT.emp where empno =&no; v_tax_sal:= v_sal *c_tax_rate; dbms_output.put_line(v_name|| v_sal ||v_tax_sal); end; /
② 复合变量(composite)
pl/sql记录:类似于高级语言中的结构体。
declare type emp_record_type is record( name SCOTT.emp.ename%type, salary SCOTT.emp.sal%type, title SCOTT.emp.job%type); sp_record emp_record_type; begin select ename,sal,job into sp_record from SCOTT.emp where empno =7788; dbms_output.put_line(sp_record.name); end;
pl/sql表:相当于高级语言中的数组。高级语言中的数组的下标不可以为负数,pl/sql中是可以为负数的。
declare type sp_table_type is table of SCOTT.EMP.ename%type index by binary_integer;--表示下标是整数 sp_table sp_table_type;--定义sp_table_type类型的变量sp_table begin select ename into sp_table(0) from SCOTT.emp where SCOTT.Emp.empno =7788; dbms_output.put_line(sp_table(0)); end;
嵌套表
varray
③ 参照变量
参照变量是用于存放数组指针的变量。使用参照变量可以使应用程序共享相同对象,从而降低占用空间。可以使用游标变量(ref cursor)和对象类型变量(ref obj_type)两种参照变量类型。
参照变量 ref cursor游标变量:当定义游标时,不需要指定select 语句,但是当使用游标时(open时)需要select语句。
例1.输入部门号,显示该部门所有员工姓名和工资
declare --定义游标 type sp_emp_cursor is ref cursor; --定义变量 v_ename SCOTT.emp.ename%type; v_sal SCOTT.emp.sal%type; --定义游标变量 test_cursor sp_emp_cursor; begin open test_cursor for select ename,sal fromSCOTT.emp where deptno =&no; loop fetch test_cursor into v_ename,v_sal; exit when test_cursor%notfound; --退出循环条件 dbms_output.put_line(v_ename||v_sal); endloop; end;
控制结构
例:编写一个存储过程,输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10%
create or replace procedure pro(v_name varchar2)is v_sal SCOTT.emp.sal%type; begin select sal intov_sal from SCOTT.emp where ename = v_name; if v_sal <2000 then update SCOTT.emp set sal = sal *1.1 where ename = v_name; endif; end;
例:编写一个过程,输入一个雇员名。如果该雇员的补助不是0,就在原来的基础上增加100.如果补助为0就把补助设为200.
create or replace procedure pro(v_name varchar2) is v_comm SCOTT.emp.COMM%type; begin select comm into v_comm from SCOTT.emp where ename =v_name; if v_comm<>0 then--<>表示不等于 update SCOTT.emp set comm= comm +100 where ename = v_name; else update SCOTT.emp set comm= comm +200 where ename = v_name; endif; end;
例:编写一个过程,输入一个雇员的编号,如果该雇员的职位是PRESIDENT,就给他的工资增加1000.如果该雇员的职位是MANAGER,就给他的工资增加500.其他职位的雇员工资增加200.
create or replace procedure pro(v_no number)is v_job SCOTT.emp.job%type; begin select job intov_job from SCOTT.emp where empno = v_no; ifv_job ='PRESIDENT'then update SCOTT.emp set sal = sal +1000 where empno = v_no; elsif v_job ='MANAGER'then update SCOTT.emp set sal = sal +500 where empno = v_no; else update SCOTT.emp set sal = sal +200 where empno = v_no; end if; end;
循环结构
例:编写一个存储过程,输入用户名,循环添加10个用户到SCOTT.student表中,用户编号从1开始增加。
create or replace procedure pro(v_name varchar2)is v_num number:=1; v_sex SCOTT.student.SEX%type:='男'; begin loop insert into SCOTT.STUDENT values(v_num,v_name, v_sex); exit whenv_num =10; v_num:= v_num +1; end loop; end;
while循环
create or replace procedure pro(v_name varchar2) is v_num number:=1; v_sex SCOTT.student.SEX%type:='男'; begin while v_num <=100 loop insert into SCOTT.STUDENT values(v_num,v_name, v_sex); v_num :=v_num +1; end loop; end;
for循环
create or replace procedure pro is v_lower number:=1; v_upper number:=10; begin for i inv_lower .. v_upper loop dbms_output.put_line('i is:'|| i); endloop; end;
goto语句
create or replace procedure pro is i int:=1; begin loop dbms_output.put_line('输出i='|| i); if(i =10)then goto end_loop; endif; i := i +1; endloop; <<end_loop>> dbms_output.put_line('循环结束'); end;
null语句不执行任何操作,并且直接将控制传递到下一句。使用null语句可以提高pl/sql的可读性。
字数超出限制,续 http://shamrock.blog.51cto.com/2079212/1541373