PL/SQL:使用pragma restrict_references限制包許可權,references

來源:互聯網
上載者:User

PL/SQL:使用pragma restrict_references限制包許可權,references

在看別人的代碼的時候,發現了如下的編譯指令,

pragma restrict_references(get_attribute_name, wnds);

 

get_attribute_name是一個pl/sql function, 當我試圖在這個函數中往一個log表裡面插入log資訊的時候,編譯都通不過,給出如下資訊,

Error(2252,1): PLS-00452: Subprogram 'GET_AMOUNT_NAME' violates its associated pragma 

 

看來就是上面這個pragma搞得鬼。 查了下Oracle 文檔, (http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/restrictreferences_pragma.htm#LNPLS01339) 

 

才知道這個pragma的作用是保證上面的那個function,不會改變資料庫的狀態 wnds (Write No Database State), 而我卻在這個函數的內部進行了寫表操作,難怪為編譯出錯。


 RESTRICT_REFERENCES pragma的用法如下:

 PRAGMA RESTRICT_REFERENCES ( subprogram_name, [RNDS, WNDS, RNPS, WNPS, TRUST])

 

 關鍵字和參數描述:

PRAGMA: 表示這是一個編譯指令,在編譯的時候執行

subprogram_name:PL/SQL 函數的名字

RNDS:(Read No Database State) 表示該subprogram不會查詢(query)資料庫中的表。

WNDS: (Write No Database State) 表示該subprogram不會改變資料庫中的表的資料。

RNPS:(Read No Package State) 不訪問包中的變數

WNPS:(Write No Package State) 不改變包中的變數值

TRUST:表示信任該subprogram不會違反前面的任何約束,一般用在PL/SQL調用外部函數,比如java代碼。

 

需要注意的是, RESTRICT_REFERENCES pragma只能出現在package specification 或者 object type specification. 

 

下面是一個簡單的例子:


CREATE PACKAGE loans AS
   FUNCTION credit_ok RETURN BOOLEAN;
   PRAGMA RESTRICT_REFERENCES (credit_ok, WNDS, RNPS);
END loans;
/

 

 

 



相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.