oracle授权存储过程
① 如何在oracle中指定某个存储过程的修改、执行权限给另一用户
不能调用存储过程,调用存储过程需要execute any procere 权限才行。
CONNECT角色: --是授予最终用户的典型权利,最基本的
ALTER SESSION --修改会话
CREATE CLUSTER --建立聚簇
CREATE DATABASE LINK --建立数据库链接
CREATE SEQUENCE --建立序列
CREATE SESSION --建立会话
CREATE SYNONYM --建立同义词
CREATE VIEW --建立视图
② 如何在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怎么只给存储过程授权执行权限不给看的权限
存储过程的相关权限一共只有两个,一个是excute权限,还有一个是debug权限。
按照你的说法就是只给excute的权限,不给debug权限,因为没试过这样能不能查看,所以你要自己试验下才行。
④ oracle存储过程如何输出信息
可用DBMS_OUTPUT.PUT_LINE()对存储过程的进行输出。
编写存储过程:
create or replace procere test_pro(in_num number)
as
M number;
begin
M := in_num;
if 0 < M then
dbms_output.put_line('输出SQL语句1');
elsif M < 3 then
dbms_output.put_line('输出SQL语句2');
else
dbms_output.put_line('nothing');
end if;
end;
(4)oracle授权存储过程扩展阅读;
存储在数据库的数据字典中,存储在当前的应用中安全性由数据库提供安全保证,必须通过授权才能使用存储子程序,安全性靠应用程序来保证,如果能执行应用程序,就能执行该子程序。模式描述IN参数用来从调用环境中向存储过程传递值,不能给IN参数赋值,给此参数传递的值可以是常量、有值的变量、表达式等。
⑤ 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存储过程
简单地讲,Oracle存储过程就是存储在Oracle数据库中的一个程序。 一. 概述 Oracle存储过程开发的要点是: · 使用Notepad文本编辑器,用Oracle PL/SQL编程语言写一个存储过程; ·在Oracle数据库中创建一个存储过程; ·在Oracle数据库中使用SQL*Plus工具运行存储过程; ·在Oracle数据库中修改存储过程; · 通过编译错误调试存储过程; · 删除存储过程; 二.环境配置 包括以下内容: · 一个文本编辑器Notepad; · Oracle SQL*Plus工具,提交Oracle SQL和PL/SQL 语句到Oracle database。 · Oracle 10g express数据库,它是免费使用的版本; 需要的技巧: · SQL基础知识,包括插入、修改、删除等 · 使用Oracle's SQL*Plus工具的基本技巧; · 使用Oracle's PL/SQL 编程语言的基本技巧; 三.写一个存储过程 存储过程使用Oracle's PL/SQL 程序语言编写,让我们写一个什么工作都不做的存储过程,我们可以编译和运行它而不用担心会对数据库产生任何损害。 在Notepad, 写下: CREATE OR REPLACE PROCEDURE skeleton IS BEGIN NULL; END; 把文件存为skeleton.sql. 让我们一行行遍历这个存储过程: 1 CREATE OR REPLACE PROCEDURE skeleton 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束 四.创建一个存储过程 SQL语句CREATE OR REPLACE PROCEDURE在Oracle数据库中创建、编译和保存一个存储过程。 从Window打开SQL*Plus并且从SQL*Plus登录到你的数据库;打开skeleton.sql文件. 在SQL>命令提示符下输入以下命令: SQL>@skeleton SQL>/ SQL*Plus装载skeleton.sql文件的内容到SQL*Plus缓冲区并且执行SQL*Plus语句;SQL*Plus 会通知你存储过程已经被成功地创建。 现在你的存储过程被创建,编译和保存在你的Oracle数据库,我们可以运行它。 五.运行一个存储过程 从SQL*Plus 命令行提示符运行你的存储过程使用EXECUTE命令,如下: SQL> EXECUTE skeleton; SQL*Plus 输出一下信息确信存储过程成功执行: PL/SQL procere successfully completed. 你也可以在一个无名PL/SQL块内运行你的存储过程,在SQL*Plus命令提示符下,它看起来像: SQL> BEGIN 2 SKELETON; 3 END; 4 / 现在我们已经运行了我们的存储过程,我们如何修改它呢? 六.修改一个存储过程 让我们写一个输出字符串“Hello World!”的存储过程,用Notepad打开你的skeleton.sql 文件,. 用DBMS_OUTPUT.PUT_LINE 过程调用去替换NULL语句,如下所示: CREATE OR REPLACE PROCEDURE skeleton IS BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; 保存到文件skeleton.sql. 从SQL*Plus命令行, 打开文件skeleton.sql . SQL> @skeleton SQL> 1 CREATE OR REPLACE PROCEDURE skeleton 2 IS 3 BEGIN 4 DBMS_OUTPUT.PUT_LINE('Hello World!'); 5* END; SQL> / SQL*Plus 通知你存储过程成功创建并输出提示信息:Procere created. SQL> 用EXECUTE 命令运行你的存储过程: SQL> EXECUTE skeleton; SQL*Plus显示存储过程运行成功:PL/SQL procere successfully completed. 我们想要的输出字符串 "Hello World!"没有出来,在显示一个DBMS_OUTPUT.PUT_LINE 结果前需要运行一个SET命令,在SQL*Plus 命令行提示符,键入: SQL> SET SERVEROUTPUT ON 再次执行你的存储过程: SQL> EXECUTE skeleton; 现在结果输出了:Hello World! PL/SQL procere successfully completed. 七.调试一个存储过程 当调试一个存储过程时,遵循一样的步骤,修改SQL文件,创建存储过程,执行存储过程,根据编译器反馈的出错信息进行修改,这一步是非常繁琐的,需要依靠经验。 在实际的商用存储过程的开发调试过程中,由于涉及很多表、类型、光标、循环、条件等复杂的逻辑,和PL/SQL语句的灵活运用,编译时会产生很多错误提示信息,程序员在根据这些错误信息定位,进行修正,再编译最后得到正确的结构; 八.放弃一个存储过程 如果在数据库中你不在需要一个存储过程你可以删除它,SQL语句 DROP PROCEDURE 完成从数据库中删除一个存储过程,DROP PROCEDURE 在SQL中被归类为数据定义语言(DDL) 类操作,其他的例子有CREATE, ALTER, RENAME 和TRUNCATE。. 在SQL*Plus 命令提示符下,使用DROP PROCEDURE SQL 语句删除你的叫做skeleton的存储过程: SQL> DROP PROCEDURE skeleton; SQL*Plus assures us the procere has been removed: Procere dropped. 总结 本文详细讨论了如何使用Oracle工具开发Oracle商用存储过程的步骤。最后在存储过程的使用中可能是程序直接调用,也可能被触发器调用。
⑦ Oracle的存储过程、触发器怎么描述
1:什么叫存储过程?
在oracle中,可以在数据库中定义子程序,这种程序块叫存储过程(procere),它存放在数据字典中,可以在不同用户和应用程序中共享,并可以实现程序的优化和重用。
2:存储过程的优点?
过程运行在服务器端,执行速度快
过程执行一次后代码就驻留在高速缓存中,在以后的操作中,直接调用缓存数据。
确保数据库的安全性,可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问数据库的过程。
自动完成需要预先执行的任务,过程可以在系统启动时自动运行。、
3:存储过程的创建和执行
用户存储过程只能定义在当前数据库中,可以使用sql语句或OEM创建。
默认情况下,用户创建的存储过程归登录数据库的用户所拥有,DBA可以把许可授权给其他用户。
Sql命令创建存储过程
CREATE procere 过程名
【(parameter parameter_mode date_type,….n)】
IS| AS
BEGIN
SQL_STATEMENT
END 过程名
其中
Parameter表示过程的参数。
parameter_mode:参数的类型,过程参数和函数参数一样,有三种类型IN,OUT,IN OUT
IN 表示参数是输入给过程的。
OUT表示采纳数载过程中被赋值,可以传给过程的外部。
IN OUT表示可以传内,可以传外。
调用存储过程
直接输入存储过程的名字可以执行一个已经定义的存储过程。
存储过程的编辑修改
修改存储过程虽然可以和修改视图一样,用ALTER procere,但是他是用来重新编译和验证用的,如果要修改过程定义,建议还是用create or replace。
存储过程的删除
当某个过程不再需要的时候,应该将其从内存中删除,以释放它占用的资源。
Drop procere 存储过程名。
Drop procere update_info.
触发器
触发器(trigger)是一些过程,与表联系紧密,用于保护表中的数据,当一个基表被修改时,触发器自动就会执行。例如出入其可以实现多个表间数据的一致性和完整性。
一般情况下,对表数据的操作有增删查改,维护数据的触发器也可以分为多种,每张基表最多可以建立12个触发器。
1:Before insert 2:before insert fo each row; 3:after inert
4:after insert for each row 5:before update 6:before update for each row
7:after update 8:after update for each row; 9:before delete;
10:before delete for each row 11:after delete 12:after delete for each row.
利用sql语句创建触发器
语法规则
Create or replace trigger 触发器名
{before| after| instead of}
{delete 【or insert】【or update】【of column ….n 】}
On 表名|视图名
【for each row 】[]where condition]]
Sql_statement[,,,n]
参数说明
Instead of :指定在创建替代触发器。
Of column 指定在哪些列上进行触发。。。
创建触发器的限制
1:触发器中有效的语句可以包括DML语句,但是不能包括DDL,rollback,commit
,savepoint都不适用。
⑧ oracle 测试存储过程 是哪个权限
Oracle规定,在默认的情况下,在调用存储过程用户的角色不起作用,即在执行存储过程时只有Public权限。所以在调用Create table时,会有权限不足的提示。
只需要使用IR Procere就能很快解决问题啦,把代码修改为如下:
CREATE OR REPLACE PROCEDURE TestProc AUTHID current_user
IS
flag number;
BEGIN
select count(*) into flag from all_tables where table_name='TEMP3';
if (flag=0) then
execute immediate 'create global temporary table TEMP3 on commit preserve rows as select * from BUSI_ECONTRACT';
else
execute immediate 'insert into TEMP3 select * from BUSI_ECONTRACT';
end if;
END ;
执行存储过程,顺利通过。
⑨ oracle存储过程中,动态创建表,并授权和创建同义词时进入异常!
这3个句子其实是独立的。你非要把它拼在一起。。。
我个人建议不这样做,
不过你非要这样做的话,注意在句子后面的分号后加上回车符
⑩ oracle赋权调用存储过程
首先,需要resource,connect
grant resource,connect to guest;
然后赋予 执行权限(对每一个存储过程授权):
grant execute on cache.xxxxxx to guest