oracle创建存储过程的权限
‘壹’ oracle赋权调用存储过程
首先,需要resource,connect
grant resource,connect to guest;
然后赋予 执行权限(对每一个存储过程授权):
grant execute on cache.xxxxxx to guest
‘贰’ oracle 创建存储过程部分表编译错误是否表空间、权限不足
你先查看错误是什么啊,好像有个什么show error的吗?
有可能是权限问题,你当前用户需要获得该表的使用权限,你上面列出来的是系统权限,还有对象的权限,你针对哪个对象有什么样的权限,需要授权,同样使用grant 授权,列如:grant select on table to user;记得没错就是这样的。还有就是该用户也要用相应表空间的使用权,这个就是修改用户的定义,指定能使用该表空间吧,没有看参考,提供这些给你参考哈!
‘叁’ oracle存储过程基本语法
一:存储过程
创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限
删除存储过程,是过程的创建者或者拥有DROP ANY PROCEDURE系统权限
修改存储过程,则只能是过程的创建者或者拥有ALTER ANY PROCEDURE系统权限的人
执行(或调用)存储过程,是过程的创建者或是拥有EXECUTE ANY PROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人
1:语法
1)创建
CREATE[ORREPLACE]PROCEDURE存储过程名[(参数[IN|OUT|INOUT] 数据类型...)]
{AS|IS}
[说明部分]
BEGIN
可执行部分
[EXCEPTION
错误处理部分]
END[过程名];
说明:
OR REPLACE 表示如果存在就覆盖存储过程
参数有三种形式:IN、OUT和IN OUT。则默认为IN。
关键字AS也可以写成IS,后跟过程的说明部分,可以在此定义过程的局部变量。
2)删除存储过程:
DROP PROCEDURE 存储过程名;
3)修改存储过程:
ALTER PROCEDURE 存储过程名 COMPILE;
4)执行存储过程
EXECUTE 模式名.存储过程名[(参数...)];
或
BEGIN
模式名.存储过程名[(参数...)];
END;
另外:参数可以是变量、常量或表达式
要其它用户执行存储过程须要给其它用户授权
GRANT EXECUTE ON 存储过程名 TO 用户名
2:参数说明
IN 定义一个输入参数变量,用于传递参数给存储过程
OUT 定义一个输出参数变量,用于从存储过程获取数据
IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能
1)参数名 IN 数据类型 DEFAULT 值;
定义一个输入参数变量,用于传递参数给存储过程。
可以是常量、有值变量或表达式
DEFAULT 关键字为可选项,用来设定参数的默认值。如果在调用存储过程时不指明参数,则参数变量取默认值
在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值。
2)参数名 OUT 数据类型;
定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序。
在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。
在存储过程中,参数变量只能被赋值而不能将其用于赋值,而且必须给输出变量至少赋值一次。
3)参数名 IN OUT 数据类型 DEFAULT 值;
定义一个输入、输出参数变量,兼有以上两者的功能。
在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。
DEFAULT 关键字为可选项,用来设定参数的默认值。
在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。在存储过程中必须给变量至少赋值一次。
补充:如果省略IN、OUT或IN OUT,则默认模式是IN。
调用它时参数个数与位置可以不一致,用以下形式调用:
EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788); //=>运算符左侧是参数名,右侧是参数表达式
二:函数
创建函数,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限
删除函数,需要是函数的创建者或者是拥有DROP ANY PROCEDURE系统权限的人
修改函数,需要是函数的创建者或者拥有ALTER ANY PROCEDURE系统权限的人
执行函数,需要是函数的创建者或拥有EXECUTE ANY PROCEDURE系统权限的人
1:语法
1)创建:
CREATE[ORREPLACE]FUNCTION函数名[(参数[IN] 数据类型...)]
RETURN数据类型
{AS|IS}
[说明部分]
BEGIN
可执行部分
RETURN(表达式)
[EXCEPTION
错误处理部分]
END[函数名];
说明:
参数是可选的,但只能是IN类型(IN关键字可以省略)。
在定义部分的RETURN 数据类型,用来表示函数的数据类型,也就是返回值的类型,不可省略。
在可执行部分的RETURN(表达式),用来生成函数的返回值,其表达式的类型应该和定义部分说明的函数返回值的数据类型一致。在函数的执行部分可以有多个RETURN语句,但只有一个RETURN语句会被执行,一旦执行了RETURN语句,则函数结束并返回调用环境。
2)删除
DROP FUNCTION 函数名;
3)修改
ALTER PROCEDURE 函数名 COMPILE;
4)执行
变量名:=函数名(...)
三:对存储过程 和 函数的查看(可以通过对数据字典【USER_SOURCE】的访问来查询存储过程或函数的有关信息)
1:查询某个存储过程序内容
select TEXT from user_source WHERE NAME='存储过程名';
2:查看数据字殿
DESCRIBE USER_SOURCE ; //命令行中
3:查看存储过程的参数
DESCRIBE say_hello; //后面是过程名
4:查看发生编辑错误
SHOW ERRORS ;
5:查询一个存储过程或函数是否是有效状态(即编译成功)
SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='过程名';//注意大小写
VALID表示该存储过程有效(即通过编译),INVALID表示存储过程无效或需要重新编译。它的状态会改变,这与它依赖外部表(表删除修改等操作)有关系
6:查看存储过程与表的依赖关系
SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';
说明
NAME为实体名,TYPE为实体类型,REFERENCED_OWNER为涉及到的实体拥有者账户,REFERENCED_NAME为涉及到的实体名,REFERENCED_TYPE 为涉及到的实体类型。
问题:
如果一个用户A被授予执行属于用户B的一个存储过程的权限,在用户B的存储过程中,访问到用户C的表,用户B被授予访问用户C的表的权限,但用户A没有被授予访问用户C表的权限,那么用户A调用用户B的存储过程是失败的还是成功的呢?答案是成功的。
‘肆’ oracle怎么只给存储过程授权执行权限不给看的权限
存储过程的相关权限一共只有两个,一个是excute权限,还有一个是debug权限。
按照你的说法就是只给excute的权限,不给debug权限,因为没试过这样能不能查看,所以你要自己试验下才行。
‘伍’ 在Oracle中创建新用户,为其授予Grant create procere to userNam权限,可是在创建存储过程时,为无效的
你这个过程本身有问题,所以是无效的,因为它编译无法通过!
‘陆’ oracle 存储过程 权限问题 PL/SQL: ORA-01031: 权限不足
权限不足就是说你还没有连接到服务器,或者你连接过了又断开了,再次连接上了就该不会出现权限问题。
‘柒’ Oracle中如果没有执行DDL权限,但是想要自己写一个存储过程并执行,是否可以创建一个临时存储过程
没有什么临时的存储过程。。。就好像楼上说的,写一个程序块吧。declare 声明的。
类似于
declare
v_qq varchar2(10);
begin
select 'wqwe' into v_qq from al ;
dbms_output.put_line(v_qq);
end;
这样的。
‘捌’ oracle怎么给存储过程赋增加表的权限
GRANT说明:
名称
GRANT — 赋予一个用户,一个组或所有用户访问权限
GRANT privilege [, ...] ON object [, ...] TO { PUBLIC | GROUP group | username }
输入
privilege 可能的权限有:
SELECT:访问声明的表/视图的所有列/字段.
INSERT:向声明的表中插入所有列字段.
UPDATE:更新声明的所有列/字段.
DELETE:从声明的表中删除所有行.
RULE: 在表/视图上定义规则 (参见 CREATE RULE 语句).
ALL: 赋予所有权限.
object 赋予权限的对象名.可能的对象是:
* table (表)
* view (视图)
* sequence (序列)
* index (索引)
PUBLIC:
代表是所有用户的简写.
GROUP group:
将要赋予权限的组 group .目前的版本中,组必须是用下面方法显式创建的.
username:
将要赋予权限的用户名.PUBLIC 是代表所有用户的简写.
输出
CHANGE: 如果成功,返回此信息.
ERROR: ChangeAcl: class "object" not found
如果所声明的对象不可用或不可能对声明的组或用户赋予权限.
‘玖’ 如何在Oracle的存储过程中拥有role权限
很多人都有这样的了解,用户拥有的role权限在存储过程是不可用的。示例:
SQL> select * from dba_role_privs where grantee='SUK';
GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
--------- ------------ ------------ ------------
SUK DBA NO YES
SUK CONNECT NO YES
SUK RESOURCE NO YES
用户SUK拥有DBA这个role.
下面我们继续创建一个测试存储过程:
create or replace procere p_create_table
is
begin
Execute Immediate 'create table create_table(id int)';
end p_create_table;
测试:
SQL> exec p_create_table;
begin p_create_table; end;
ORA-01031: 权限不足
ORA-06512: 在"SUK.P_CREATE_TABLE", line 3
ORA-06512: 在line 1
可以看到,即使拥有DBA role,也不能创建表。role在存储过程中不可用。
遇到
这种情况,我们一般需要显式进行系统权限,如grant create table to suk;
但这种方法太麻烦,有时候可能需要进行非常多的授权才能执行存储过程
实际上,oracle给我们提供了在存储过程中使用role权限的方法:
修改存储过程,加入Authid Current_User时存储过程可以使用role权限。
create or replace procere p_create_table
Authid Current_User is
begin
Execute Immediate 'create table create_table(id int)';
end p_create_table;
然后继续尝试执行:
SQL> exec p_create_table;
PL/SQL procere successfully completed
至此即可以执行了。
‘拾’ oracle创建存储过程
--- 答案补充
1. lixiaoka3这个用户是不是不存在, 试试CREATE OR REPLACE PROCEDURE xianshi
2. 存储过程里面应该不能有单纯的select语句存在的, 你的select语句没有实际用处,即便查询出来了也看不到.如果要看这个表所有的数据的话,你可以做一个游标,然后把每个字段都put出来.
