OraclePL/SQL(四)

2014-11-24 12:48:45 · 作者: · 浏览: 3
缺失或无效

创建一个用户:

create user xxx identified by yyy

当密码里面有特殊字符时 windows平台下面应该用 "yyy" 其它平台未测试

刚创建好的用户是没有任何权限的 连登录数据库的权限都没有

这时,就要给用户授予权限:

ORACLE里面的权限有系统权限和对象权限两种

可以通过

select distinct p.privilege

from user_sys_privs p

order by p.privilege asc;

来查询ORACLE里面的所有系统权限;

常用的系统权限有 :

CREATE SESSION 创建会话 登录数据库

CREATE SEQUENCE 创建序列

CREATE SYNONYM 创建同名对象

CREATE TABLE 在用户模式中创建表

CREATE ANY TABLE 在任何模式中创建表

DROP ANY TABLE 在任何模式中删除表

CREATE PROCEDURE 创建存储过程

EXECUTE ANY PROCEDURE 执行任何模式的存储过程

CREATE USER 创建用户

DROP USER 删除用户

CREATE VIEW 创建视图

通过下面的SQL可以查询所有的对象权限:

select distinct t.privilege fromuser_tab_privs t;

结果如下:

FLASHBACK
EXECUTE
ONCOMMIT REFRESH
ALTER
DEQUEUE
UPDATE
DELETE
DEBUG
UNDER
QUERY REWRITE
SELECT
READ
INSERT
INDEX
WRITE
REFERENCES
MERGE VIEW

另外还有角色授权 可以通过下面的SQL来查询ORALCE里面内置有哪些角色:

select distinct r.granted_role role_name

from user_role_privs r

where r.default_role = 'YES'

order by role_name asc;

授权语句:grant 权限

系统授权直接写:grant 权限名称 to 用户名;

对象权限则要写成:grant 权限名称 on schema. 对象名 to 用户名

还要注意一点是:授予权的时候系统权限和对象权限不能同时写,也就是说不能写成下面这个样子:

GRANT CREATE TABLE, SELECT ON scott.testTO scott1

这样写会报 ORA-00990: 权限缺失或无效

但是系统权限和角色是可以同时写在一起授予给某一个用户的

3. oracle之报错:ORA-00054: 资源正忙,要求指定NOWAIT

解决方案:

select session_id from v$locked_object; --首先得到被锁对象的session_id

SELECT sid, serial#, username, osuser FROM v$sessionwhere sid = session_id; --通过上面得到的session_id去取得v$session的sid和serial#,然后对该进程进行终止。

ALTER SYSTEM KILL SESSION 'sid,serial';

example:

ALTER SYSTEM KILL SESSION '13, 8';

--ora0054

--查找锁定的会话

select session_id fromv$locked_object;

SELECTsid, serial#,username, osuser

FROM v$session

wheresidin (4908, 4913, 4955);

--杀死会话

ALTERSYSTEMKILLSESSION'4908,2223';

ALTERSYSTEMKILLSESSION'4913,937';

ALTERSYSTEMKILLSESSION'4955,3079';

--查找锁

select * from v$lock whereblock=1;

select * from v$locked_object;

--查看当前用户的一些权限

selectdistinct p.privilegefromuser_sys_privs p;

4. 层次查询实例也可以利用两个嵌套的游标实现

PLSQL\PACKAGE_GET_AUDIT_DESC.pck

selectdistinct x.form_kind, x.form_no, auditm

from (selectt.FORM_KIND,

t.FORM_NO,

substr(sys_connect_by_path(t.AUDITM,','), 2) auditm,

level lv,

max(level) over(partitionbyt.FORM_KIND, t.FORM_NO) max_level

fromdw_tes_flow_audit_fs_v t

where1 = 1

/*andt.FORM_KIND = 'SYS.FORM.009'

andt.FORM_NO = '277721'*/

andconnect_by_isleaf = 1

connectbyprior t.FORM_KIND= t.FORM_KIND

andprior t.FORM_NO =t.FORM_NO

andprior t.AUDITM< t.AUDITM) x

where lv =max_level;