對於共享程序使用調用者權限
當a用戶的 shema下創建了一個程序,並賦予了這些程序的execute權限爲public
當b用戶登錄到自己的所屬shema 使執行如下命令:
sql> a.exec_ddl('create table table_a(id number)');
那麼則會在a 用戶下創建一個table_a的表,這其實不是我們想要的,我們想要在b用戶下建立表,那麼需要使用調用者權限模型,在存儲過程exec_ddl中聲明下
procedure exec_ddl(ddlstring in varchar2)
AUTHID CURRENT_USER
IS
BEGIN
EXECUTE IMMEDIATE ddl_string;
END;
動態sql中的異常處理
一個比較好的開發習慣是執行動態sql的時候加入異常處理和跟蹤機制
procedure exec_ddl(ddlstring in varchar2)
AUTHID CURRENT_USER
IS
BEGIN
EXECUTE IMMEDIATE ddl_string;
EXCEPTION
WHEN OTHERS THEN
dbms_output.pub_line('Dynamic SQL Failure : ' || DMBS_UTILITY.FORMAT_ERROR_STACK);
dbms_output.pub_line('on statement :" ' || ddl_string '"');
END;
多使用變量綁定而非字符串拼接
好處如下:
- 綁定變量性能更高,這樣能夠利用緩存在SGA中的預解析遊標
- 避免隱式轉換和易於維護,一串數字如果當成字符的話需要加to_char,而變量綁定這避免了這個麻煩
- 安全性高,避免代碼注入
- 代碼簡潔易懂易於維護