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