韩顺平玩转oracle视频教程笔记

更新时间:2023-10-04 05:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

韩顺平—玩转oracle视频教程笔记

一:Oracle认证,与其它数据库比较,安装

Oracle安装会自动的生成sys用户和system用户:

(1) sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,

该用户默认的密码是change_on_install

(2) system用户是管理操作员,权限也很大。具有sysoper角色,没有create database的

权限,默认的密码是manager

(3) 一般讲,对数据库维护,使用system用户登录就可以拉

也就是说sys和system这两个用户最大的区别是在于有没有create database的权限。

二: Oracle的基本使用--基本命令

sql*plus的常用命令

连接命令

1.conn[ect]

用法:conn 用户名/密码@网络服务名[as sysdba/sysoper]当用特权用户身份连接时,必须带上as sysdba或是as sysoper 2.disc[onnect]

说明: 该命令用来断开与当前数据库的连接 3.psssw[ord]

说明: 该命令用于修改用户的密码,如果要想修改其它用户的密码,需要用sys/system登录。 4.show user

说明: 显示当前用户名 5.exit

说明: 该命令会断开与数据库的连接,同时会退出sql*plus

文件操作命令

1.start和@

说明: 运行sql脚本

案例: sql>@ d:\\a.sql或是sql>start d:\\a.sql 2.edit

说明: 该命令可以编辑指定的sql脚本

案例: sql>edit d:\\a.sql,这样会把d:\\a.sql这个文件打开 3.spool

说明: 该命令可以将sql*plus屏幕上的内容输出到指定文件中去。 案例: sql>spool d:\\b.sql 并输入 sql>spool off

交互式命令

1.&

说明:可以替代变量,而该变量在执行时,需要用户输入。 select * from emp where job='&job'; 2.edit

说明:该命令可以编辑指定的sql脚本 案例:SQL>edit d:\\a.sql 3.spool

说明:该命令可以将sql*plus屏幕上的内容输出到指定文件中去。 spool d:\\b.sql 并输入 spool off

显示和设置环境变量

概述:可以用来控制输出的各种格式,set show如果希望永久的保存相关的设置,可以去修改glogin.sql脚本 1.linesize

说明:设置显示行的宽度,默认是80个字符 show linesize set linesize 90

2.pagesize说明:设置每页显示的行数目,默认是14 用法和linesize一样

至于其它环境参数的使用也是大同小异

三:oracle用户管理

oracle用户的管理

创建用户

概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用。

create user 用户名 identified by 密码; (oracle有个毛病,密码必须以字母开头,如果以字母开头,它不会创建用户)

给用户修改密码

概述:如果给自己修改密码可以直接使用 password 用户名

如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限 SQL> alter user 用户名 identified by 新密码

删除用户

概述:一般以dba的身份去删除某个用户,如果用其它用户去删除用户则需要具有drop user的权限。

比如 drop user 用户名 【cascade】 在删除用户时,注意:

如果要删除的用户,已经创建了表,那么就需要在删除的时候带一个参数cascade;

用户管理的综合案例

概述:创建的新用户是没有任何权限的,甚至连登陆的数据库的权限都没有,需要为其指定相应的权限。给一个用户赋权限使用命令grant,回收权限使用命令revoke。 为了给讲清楚用户的管理,这里我给大家举一个案例。 SQL> conn xiaoming/m12; ERROR:

ORA-01045: user XIAOMING lacks CREATE SESSION privilege; logon denied 警告: 您不再连接到 ORACLE。

SQL> show user; USER 为 \

SQL> conn system/p; 已连接。

SQL> grant connect to xiaoming; 授权成功。

SQL> conn xiaoming/m12; 已连接。 SQL>

注意:grant connect to xiaoming;在这里,准确的讲,connect不是权限,而是角色。。 看图:

现在说下对象权限,现在要做这么件事情: * 希望xiaoming用户可以去查询emp表

* 希望xiaoming用户可以去查询scott的emp表 grant select on emp to xiaoming

* 希望xiaoming用户可以去修改scott的emp表 grant update on emp to xiaoming

* 希望xiaoming用户可以去修改/删除,查询,添加scott的emp表 grant all on emp to xiaoming

* scott希望收回xiaoming对emp表的查询权限 revoke select on emp from xiaoming

//对权限的维护。

* 希望xiaoming用户可以去查询scott的emp表/还希望xiaoming可以把这个权限继续给别人。

--如果是对象权限,就加入 with grant option

grant select on emp to xiaoming with grant option 我的操作过程:

SQL> conn scott/tiger; 已连接。

SQL> grant select on scott.emp to xiaoming with grant option; 授权成功。

SQL> conn system/p; 已连接。

SQL> create user xiaohong identified by m123; 用户已创建。

SQL> grant connect to xiaohong; 授权成功。

SQL> conn xiaoming/m12; 已连接。

SQL> grant select on scott.emp to xiaohong; 授权成功。

--如果是系统权限。

system给xiaoming权限时:

grant connect to xiaoming with admin option

问题:如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样? 答案:被回收。

下面是我的操作过程: SQL> conn scott/tiger; 已连接。

SQL> revoke select on emp from xiaoming; 撤销成功。

SQL> conn xiaohong/m123; 已连接。

SQL> select * from scott.emp; select * from scott.emp 第 1 行出现错误:

ORA-00942: 表或视图不存在

结果显示:小红受到诛连了。

使用profile管理用户口令

概述:profile是口令限制,资源限制的命令集合,当建立数据库的,oracle会自动建立名称为default的profile。当建立用户没有指定profile选项,那么oracle就会将default分配给用户。

1.账户锁定

概述:指定该账户(用户)登陆时最多可以输入密码的次数,也可以指定用户锁定的时间(天)

一般用dba的身份去执行该命令。

例子:指定scott这个用户最多只能尝试3次登陆,锁定时间为2天,让我们看看怎么实现。 创建profile文件

SQL> create profile lock_account limit failed_login_attempts 3 password_lock_time 2; SQL> alter user scott profile lock_account;

2.给账户(用户)解锁

SQL> alter user tea account unlock;

3.终止口令

为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要dba的身份来操作。

例子:给前面创建的用户tea创建一个profile文件,要求该用户每隔10天要修改自己的登陆密码,宽限期为2天。看看怎么做。

SQL> create profile myprofile limit password_life_time 10 password_grace_time 2; SQL> alter user tea profile myprofile;

口令历史

概述:如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密码。 例子:

1)建立profile

SQL>create profile password_history limit password_life_time 10 password_grace_time 2 password_reuse_time 10

password_reuse_time //指定口令可重用时间即10天后就可以重用 2)分配给某个用户

删除profile

概述:当不需要某个profile文件时,可以删除该文件。 SQL> drop profile password_history 【casade】

注意:文件删除后,用这个文件去约束的那些用户通通也都被释放了。 加了casade,就会把级联的相关东西也给删除掉

四:oracle表的管理(数据类型,表创建删除,数据CRUD操作 oracle的表的管理 表名和列的命名规则

必须以字母开头

? 长度不能超过30个字符 ? 不能使用oracle的保留字

? 只能使用如下字符 A-Z,a-z,0-9,$,#等

?

oracle支持的数据类型?

字符类

char 定长 最大2000个字符。

例子:char(10) ?小韩?前四个字符放?小韩?,后添6个空格补全 如?小韩?

varchar2(20) 变长 最大4000个字符。

例子:varchar2(10) ?小韩? oracle分配四个字符。这样可以节省空间。 clob(character large object) 字符型大对象 最大4G

char 查询的速度极快浪费空间,查询比较多的数据用。

varchar 节省空间

数字型

number范围 -10的38次方 到 10的38次方 可以表示整数,也可以表示小数 number(5,2)

表示一位小数有5位有效数,2位小数 范围:-999.99到999.99 number(5)

表示一个5位整数 范围99999到-99999

日期类型

date 包含年月日和时分秒 oracle默认格式 1-1月-1999

timestamp 这是oracle9i对date数据类型的扩展。可以精确到毫秒。 图片

blob 二进制数据 可以存放图片/声音 4G 一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。

怎样创建表 建表

--学生表

create table student ( ---表名

xh number(4), --学号 xm varchar2(20), --姓名 sex char(2), --性别

birthday date, --出生日期 sal number(7,2) --奖学金 );

--班级表

CREATE TABLE class( classId NUMBER(2), cName VARCHAR2(40)

);

修改表

添加一个字段

SQL>ALTER TABLE student add (classId NUMBER(2)); 修改一个字段的长度

SQL>ALTER TABLE student MODIFY (xm VARCHAR2(30)); 修改字段的类型/或是名字(不能有数据) 不建议做 SQL>ALTER TABLE student modify (xm CHAR(30));

删除一个字段 不建议做(删了之后,顺序就变了。加就没问题,应为是加在后面)

SQL>ALTER TABLE student DROP COLUMN sal; 修改表的名字 很少有这种需求? SQL>RENAME student TO stu; 删除表?

SQL>DROP TABLE student;

添加数据

所有字段都插入数据?

INSERT INTO student VALUES ('A001', '张三', '男', '01-5月-05', 10); oracle中默认的日期格式‘dd-mon-yy’ dd日子(天) mon 月份 yy 2位的年 ‘09-6月-99’ 1999年6月9日

修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)

ALTER SESSION SET NLS_DATE_FORMAT ='yyyy-mm-dd'; 修改后,可以用我们熟悉的格式添加日期类型:

INSERT INTO student VALUES ('A002', 'MIKE', '男', '1905-05-06', 10); 插入部分字段?

INSERT INTO student(xh, xm, sex) VALUES ('A003', 'JOHN', '女'); 插入空值?

INSERT INTO student(xh, xm, sex, birthday) VALUES ('A004', 'MARTIN', '男', null);

问题来了,如果你要查询student表里birthday为null的记录,怎么写sql呢?

错误写法:select * from student where birthday = null; 正确写法:select * from student where birthday is null; 如果要查询birthday不为null,则应该这样写:

select * from student where birthday is not null;

修改数据 修改一个字段

UPDATE student SET sex = '女' WHERE xh = 'A001'; 修改多个字段

UPDATE student SET sex = '男', birthday = '1984-04-01' WHERE xh = 'A001'; 修改含有null值的数据

不要用 = null 而是用 is null;

SELECT * FROM student WHERE birthday IS null;

删除数据

DELETE FROM student;

删除所有记录,表结构还在,写日志,可以恢复的,速度慢。 Delete 的数据可以恢复。 savepoint a; --创建保存点 DELETE FROM student;

rollback to a; --恢复到保存点

一个有经验的DBA,在确保完成无误的情况下要定期创建还原点。 DROP TABLE student; --删除表的结构和数据;

delete from student WHERE xh = 'A001'; --删除一条记录;

truncate TABLE student; --删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。

五:oracle表查询(1)

oracle表基本查询 介绍

在我们讲解的过程中我们利用scott用户存在的几张表(emp,dept)为大家演示如何使用select语句,select语句在软件编程中非常有用,希望大家好好的掌握。 emp 雇员表 clerk 普员工 salesman 销售 manager 经理 analyst 分析师 president 总裁 mgr 上级的编号 hiredate 入职时间 sal 月工资 comm 奖金 deptno 部门 dept部门表

deptno 部门编号 accounting 财务部 research 研发部 operations 业务部 loc 部门所在地点 salgrade 工资级别 grade 级别 losal 最低工资 hisal 最高工资

1. 查出各个部门的平均工资和部门号

SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno; 2. 把上面的查询结果看做是一张子表

SELECT e.ename, e.deptno, e.sal, ds.mysal FROM emp e, (SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno) ds WHERE e.deptno = ds.deptno AND e.sal > ds.mysal;

如何衡量一个程序员的水平?

网络处理能力, 数据库, 程序代码的优化程序的效率要很高

小总结:

在这里需要说明的当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名。

注意:别名不能用as,如:SELECT e.ename, e.deptno, e.sal, ds.mysal FROM emp e, (SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno) as ds WHERE e.deptno = ds.deptno AND e.sal > ds.mysal;

在ds前不能加as,否则会报错 (给表取别名的时候,不能加as;但是给列取别名,是可以加as的)

分页查询

按雇员的id号升序取出

oracle的分页一共有三种方式

1.根据rowid来分

select * from t_xiaoxi where rowid in (select rid from (select rownum rn, rid from(select rowid rid, cid from t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc; 执行时间0.03秒 2.按分析函数来分

select * from (select t.*, row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980; 执行时间1.01秒 3.按rownum来分

select * from (select t.*,rownum rn from(select * from t_xiaoxi order by cid desc)t where rownum<10000) where rn>9980; 执行时间0.1秒

其中t_xiaoxi为表名称,cid为表的关键字段,取按cid降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录。

个人感觉1的效率最好,3次之,2最差。

//测试通过的分页查询okokok

select * from (select a1.*, rownum rn from(select ename,job from emp) a1 where rownum<=10)where rn>=5;

下面最主要介绍第三种:按rownum来分

1. rownum 分页

SELECT * FROM emp; 2. 显示rownum[oracle分配的]

SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e; rn相当于Oracle分配的行的ID号 3.挑选出6—10条记录 先查出1-10条记录

SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10; 如果后面加上rownum>=6是不行的, 4. 然后查出6-10条记录

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6; 5. 几个查询变化

a. 指定查询列,只需要修改最里层的子查询 只查询雇员的编号和工资

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6; b. 排序查询,只需要修改最里层的子查询 工资排序后查询6-10条数据

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp ORDER by sal) e WHERE ROWNUM <= 10) WHERE rn >= 6;

用查询结果创建新表

这个命令是一种快捷的建表方式

CREATE TABLE mytable (id, name, sal, job, deptno) as SELECT empno, ename, sal, job, deptno FROM emp;

创建好之后,desc mytable;和select * from mytable;看看结果如何?

合并查询 合并查询

有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,union all,intersect,minus

多用于数据量比较大的数据局库,运行速度快。 1). union

该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。 SELECT ename, sal, job FROM emp WHERE sal >2500 UNION

SELECT ename, sal, job FROM emp WHERE job = 'MANAGER'; 2).union all

该操作符与union相似,但是它不会取消重复行,而且不会排序。 SELECT ename, sal, job FROM emp WHERE sal >2500 UNION ALL

SELECT ename, sal, job FROM emp WHERE job = 'MANAGER';

该操作符用于取得两个结果集的并集。当使用该操作符时,不会自动去掉结果集中重复行。

3). intersect

使用该操作符用于取得两个结果集的交集。

SELECT ename, sal, job FROM emp WHERE sal >2500 INTERSECT

SELECT ename, sal, job FROM emp WHERE job = 'MANAGER'; 4). minus

使用改操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不存在第二个集合中的数据。

SELECT ename, sal, job FROM emp WHERE sal >2500 MINUS

SELECT ename, sal, job FROM emp WHERE job = 'MANAGER'; (MINUS就是减法的意思)

创建数据库有两种方法:

1). 通过oracle提供的向导工具。√

database Configuration Assistant 【数据库配置助手】 2).我们可以用手工步骤直接创建。

七:java操作oracle

java连接oracle

介绍:前面我们一直在plsql中操作oracle,那么如何在java 程序中操作数据库呢? 下面我们举例说明,写一个java,分页显示emp表的用户信息。 Java代码

1. package com.sp; 2.

3. import java.sql.Connection; 4. import java.sql.DriverManager; 5. import java.sql.ResultSet; 6. import java.sql.Statement; 7.

8. //演示 如何使用 jdbc_odbc桥连接方式 9. public class TestOracle { 10.

11. public static void main(String[] args) { 12. try { 13.

14. // 1.加载驱动

15. Class.forName(\16.

17. // 2.得到连接

18. Connection ct = DriverManager.getConnection(

19. \20.

21.\22.

23. // 从下面开始,和SQL Server一模一样 24. Statement sm = ct.createStatement();

25. ResultSet rs = sm.executeQuery(\;

26. while (rs.next()) { 27. //用户名

28. System.out.println(\用户名: \2));

29. //默认是从1开始编号的 30. }

31. } catch (Exception e) { 32. e.printStackTrace(); 33. } 34. } 35.}

在得到连接那里,要去配置数据源,点击控制面板-->系统和安全-->管理工具-->数据源(ODBC),打开后点添加,如图: 可以看到,有个Oracle in OraDb10g_home1的驱动,它是Oracle安装完后自动加上去的。 选中后,点完成,再填如下信息,如图:

这样配好后基本就可以了,但为了安全起见,建议大家测试一下,点击 Test Connection按钮, 测试通过后点ok,然后数据源就生成了,如图:

然后把数据源名称写进jdbc.odbc:里。

这里要注意:jdbcodbc能不能远程连接呢?不能远程连接,也就是你这样写的话就意味着java程序和oracle数据库应该是在同一台机器上,因为这里没有指定IP地址,肯定默认就是本地。如果要远程连,就用jdbc,jdbc是可以远程连的。

运行TestOracle.java,控制台输出....................... 可惜我没运行成功,说

java.sql.SQLException: No suitable driver found for jdbc.odbc:testConnectOracle

at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at com.sp.TestOracle.main(TestOracle.java:18) 不知道为什么。。。

接下来讲解用JDBC的方式连接Oracle Java代码

1. package com.sp; 2.

3. import java.sql.Connection; 4. import java.sql.DriverManager; 5. import java.sql.ResultSet; 6. import java.sql.Statement; 7.

8. //使用 jdbc连接oracle 9. public class TestOracle2 {

访问别的方案的对象,则必须具有对象的权限。

比如smith用户要访问scott.emp表(scott:方案,emp:表) 常用的有:

alter 修改 delete 删除 select 查询 insert 添加

update 修改 index 索引 references 引用 execute 执行 ? 显示对象权限

通过数据字段视图可以显示用户或是角色所具有的对象权限。视图为dba_tab_privs

SQL> conn system/manager;

SQL> select distinct privilege from dba_tab_privs;

SQL> select grantor, owner, table_name, privilege from dba_tab_privs where grantee = 'BLAKE';

1.授予对象权限

在oracle9i前,授予对象权限是由对象的所有者来完成的,如果用其它的用户来操作,则需要用户具有相应的(with grant option)权限,从oracle9i开始,dba用户(sys,system)可以将任何对象上的对象权限授予其它用户。授予对象权限是用grant命令来完成的。 对象权限可以授予用户,角色,和public。在授予权限时,如果带有with grant option选项,则可以将该权限转授给其它用户。但是要注意with grant option选项不能被授予角色。

1.monkey用户要操作scott.emp表,则必须授予相应的对象权限 1). 希望monkey可以查询scott.emp表的数据,怎样操作? grant select on emp to monkey;

2). 希望monkey可以修改scott.emp的表数据,怎样操作? grant update on emp to monkey;

3). 希望monkey可以删除scott.emp的表数据,怎样操作? grant delete on emp to monkey;

4). 有没有更加简单的方法,一次把所有权限赋给monkey? grant all on emp to monkey;

2.能否对monkey访问权限更加精细控制。(授予列权限)

1). 希望monkey只可以修改scott.emp的表的sal字段,怎样操作? grant update on emp(sal) to monkey

2).希望monkey只可以查询scott.emp的表的ename,sal数据,怎样操作? grant select on emp(ename,sal) to monkey ...

3.授予alter权限

如果black用户要修改scott.emp表的结构,则必须授予alter对象权限 SQL> conn scott/tiger

SQL> grant alter on emp to blake;

当然也可以用system,sys来完成这件事。 4.授予execute权限

如果用户想要执行其它方案的包/过程/函数,则须有execute权限。

比如为了让ken可以执行包dbms_transaction,可以授予execute权限。 SQL> conn system/manager

SQL> grant execute on dbms_transaction to ken; 5.授予index权限

如果想在别的方案的表上建立索引,则必须具有index对象权限。

如果为了让black可以在scott.emp表上建立索引,就给其index的对象权限 SQL> conn scott/tiger

SQL> grant index on scott.emp to blake; 6.使用with grant option选项

该选项用于转授对象权限。但是该选项只能被授予用户,而不能授予角色 SQL> conn scott/tiger;

SQL> grant select on emp to blake with grant option; SQL> conn black/shunping

SQL> grant select on scott.emp to jones;

回收对象权限?

在oracle9i中,收回对象的权限可以由对象的所有者来完成,也可以用dba用户(sys,system)来完成。

这里要说明的是:收回对象权限后,用户就不能执行相应的sql命令,但是要注意的是对象的权限是否会被级联收回?【级联回收】 如:scott------------->blake-------------->jones

select on emp select on emp select on emp SQL> conn scott/tiger@accp

SQL> revoke select on emp from blake

请大家思考,jones能否查询scott.emp表数据。 答案:查不了了(和系统权限不一样,刚好相反)

十五:角色 介绍

角色就是相关权限的命令集合,使用角色的主要目的就是为了简化权限的管理,假定有用户a,b,c为了让他们都拥有权限 1. 连接数据库

2. 在scott.emp表上select,insert,update。 如果采用直接授权操作,则需要进行12次授权。

因为要进行12次授权操作,所以比较麻烦喔!怎么办?

如果我们采用角色就可以简化: 首先将creat session,select on scott.emp,insert on scott.emp, update on scott.emp授予角色,然后将该角色授予a,b,c用户,这样就可以三次授权搞定。

角色分为预定义和自定义角色两类: 预定义角色?

预定义角色是指oracle所提供的角色,每种角色都用于执行一些特定的管理任务,下面我们介绍常用的预定义角色connect,resource,dba

1.connect角色

connect角色具有一般应用开发人员需要的大部分权限,当建立了一个用户后,多数情况下,只要给用户授予connect和resource角色就够了,那么connect角色具有哪些系统权限呢? alter session create cluster

create database link create session create table create view

create sequence

2.resource角色

resource角色具有应用开发人员所需要的其它权限,比如建立存储过程,触发器等。这里需要注意的是resource角色隐含了unlimited tablespace系统权限。

resource角色包含以下系统权限: create cluster create indextype create table create sequence create type

create procedure create trigger 3.dba角色

dba角色具有所有的系统权限,及with admin option选项,默认的dba用户为sys和system,它们可以将任何系统权限授予其他用户。但是要注意的是dba角色不具备sysdba和sysoper的特权(启动和关闭数据库)。

自定义角色?

顾名思义就是自己定义的角色,根据自己的需要来定义。一般是dba来建立,如果用别的用户来建立,则需要具有create role的系统权限。在建立角色时可以指定验证方式(不验证,数据库验证等)。 1.建立角色(不验证)

如果角色是公用的角色,可以采用不验证的方式建立角色。 create role 角色名 not identified; 2.建立角色(数据库验证)

采用这样的方式时,角色名、口令存放在数据库中。当激活该角色时,必须提供口令。在建立这种角色时,需要为其提供口令。 create role 角色名 identified by 密码;

角色授权

当建立角色时,角色没有任何权限,为了使得角色完成特定任务,必须为其授予相应的系统权限和对象权限。

1.给角色授权

给角色授予权限和给用户授权没有太多区别,但是要注意,系统权限的

unlimited tablespace和对象权限的with grant option选项是不能授予角色的。

SQL> conn system/manager;

SQL> grant create session to 角色名 with admin option SQL> conn scott/tiger@myoral;

SQL> grant select on scott.emp to 角色名;

SQL> grant insert, update, delete on scott.emp to 角色名; 通过上面的步骤,就给角色授权了。 2.分配角色给某个用户

一般分配角色是由dba来完成的,如果要以其它用户身份分配角色,则要求用户必须具有grant any role的系统权限。 SQL> conn system/manager;

SQL> grant 角色名 to blake with admin option;

因为我给了with admin option选项,所以,blake可以把system分配给它的角色分配给别的用户。

删除角色? 使用drop role,一般是dba来执行,如果其它用户则要求该用户具有drop any role系统权限。

SQL> conn system/manager; SQL> drop role 角色名; 问题:如果角色被删除,那么被授予角色的用户是否还具有之前角色里的权限? 答案:不具有了

显示角色信息? 1.显示所有角色

SQL> select * from dba_roles; 2.显示角色具有的系统权限

SQL> select privilege, admin_option from role_sys_privs where role='角色名';

3.显示角色具有的对象权限

通过查询数据字典视图dba_tab_privs可以查看角色具有的对象权限或是列的权限。

4.显示用户具有的角色,及默认角色

当以用户的身份连接到数据库时,oracle会自动的激活默认的角色,通过查询数据字典视图dba_role_privs可以显示某个用户具有的所有角色及当前默认的角色 SQL> select granted_role, default_role from dba_role_privs where grantee = ‘用户名’;

精细访问控制?

精细访问控制是指用户可以使用函数,策略实现更加细微的安全访问控制。如

果使用精细访问控制,则当在客户端发出sql语句(select,insert,update,delete)时,oracle会自动在sql语句后追加谓词(where子句),并执行新的sql语句,通过这样的控制,可以使得不同的数据库用户在访问相同表时,返回不同的数据信息,如:

用户 scott blake jones 策略 emp_access 数据库表 emp

如上图所示,通过策略emp_access,用户scott,black,jones在执行相同的sql语句时,可以返回不同的结果。例如:当执行select ename from emp; 时,根据实际情况可以返回不同的结果。

十六:PL/SQL 块的结构和实例 pl/sql的介绍 pl/sql是什么

pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大。 看图:

为什么学pl/sql 学习必要性?

1.提高应用程序的运行性能

2.模块化的设计思想【分页的过程,订单的过程,转账的过程。。】 3.减少网络传输量 4.提高安全性(sql会包括表名,有时还可能有密码,传输的时候会泄露。PL/SQL就不会)

为什么PL/SQL会快呢?看图: 不好的地方:

移植性不好(换数据库就用不了),

用什么编写pl/sql sqlplus开发工具?

sqlplus是oracle公司提供的一个工具,这个因为我们在以前介绍过的: 举一个简单的案例:

编写一个存储过程,该过程可以向某表中添加记录。 1.创建一个简单的表

Sql代码

1. create table mytest(name varchar2(30),passwd varchar2(30));

2.创建过程

本文来源:https://www.bwwdw.com/article/iobd.html

微信扫码分享

《韩顺平玩转oracle视频教程笔记.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
下载全文
范文搜索
下载文档
Top