對使用動態SQL的幾點建議

2021-08-07 22:53:35 字數 2628 閱讀 6725

在動態sql中使用authidcurrent_user子句,來實現呼叫者模型。

例子:procedur eexec_ddl(ddl_string in varchar2)

authid current_user

isbegin

execute immediate ddl_string;

end;

當我們進行大量的動態sql時,很容易引起混亂,而且在除錯**上會浪費很多時間——除非我們在編寫動態sql時採取預防措施。

建議如下:

1、在呼叫executeimmediate和open for語句時,總是準備乙個異常處理單元;

2、在每個異常處理程式中,記錄和/或顯示發生錯誤時的錯誤訊息和sql語句;

3、 我們可能ahi需要考慮在這些語句前面新增乙個「跟蹤機制」,這樣就可以在動態sql構建和執行時方便觀察了。

例如,下面例子新增了乙個錯誤處理部分來顯示所出現的問題:

procedure exec_ddl(ddl_string in varchar2)

authid current_user

isbegin

execute immediate ddl_string;

exception

when others then

dbms_output.put_line(『dynamicsql failure: 』 || dbms_utility.format_error_stack);

dbms_output.put_line(『 onstatement: 「』 || ddl_string || 『」』);

raise;

end;

當我們試圖用乙個錯誤的語法建立乙個表的時候,會看到如下內容:

sql> exec exec_ddl(『create table x』)

dynamic sql failure: ora-00906: missingleft parenthesis on statement:」create table x」

構建pl/sql程式來實現使用者在執行時指定的任何表的內容:

繫結拼接

execute immediate 『update 』 || tab ||

『set sal = :new_sal 』 using v_sal;

execute immediate 『update 』 || tab ||

『set sal = 』 || v_sal

繫結包括使用佔位符和using子句;拼接則通過直接在sql字串內新增值而縮短處理過程。

建議盡可能地使用繫結,原因如下:

1、繫結通常更快

2、繫結更容易編寫和維護

3、繫結有助於避免隱式轉換

4、繫結避免了發生**注入的機會

如果依靠大量的拼接,寫出的語句可能是:

execute immediate

『update emp set empsal = 』 || val_in ||

『where hiredate between 』 ||

『 to_date(『』』 ||to_char(v_start) || 『』』)』 ||

『 and 』 ||

『 to_date(『』』 ||to_char(v_end) || 『』』)』;

而切換到繫結時我們的**更容易理解:

execute immediate

『update emp set empsal = :v_sal

where hiredate between :v_satrt and :v_end』

using v_sal,v_start, v_end;

考慮下面的示例:

procedure get_rows(table_in in varchar2,where_in in varchar2) is

begin

execute immediate 'declare

l_row ' || table_in || '%rowtype;

begin

select * into l_row

from ' || table_in || ' where ' || where_in || ';

end;';

end;

以下是對get_rows的sql注入,如果有所有者schema具有的許可權,就可以建立乙個「後門」程式,

它將執行我們通過動態字串傳遞的任何語句。

begin

get_rows('emp',

'empno = 7369;

execute immediate

''create procedure backdoor (str varchar2)

as begin execute immediate str; end;''' );

end;*/

為了把發生**注入的可能性降到最低,提供一下幾點建議:

1、 嚴格限制使用者schema許可權,如不允許該schema建立資料庫物件、移除資料庫物件或直接訪問表;

不允許與作業系統互動(或可互動)的包的執行,如utl_smtp、utl_file、utl_tcp和dbms_pipe。

2、盡量使用繫結變數

3、檢查動態文字中的危險文字,如分號

4、使用dbms_assert來驗證輸入(在11g及以後的版本中才有)

遊戲策劃 對新人的幾點建議

想當策劃的人很多,雖然這個行業其實不是真的那麼美好,但依然有很多人為了很多的理由想進入這個行業。很多新人在期望入行的時候總會有這樣那樣的疑問,而疑問最多的大概就是做策劃應該具備什麼樣的能力和素質。答案可以說是遍地都是,各種說法都有。贊同也好,不贊同也好,但都有各自的理由。一 請認真對待你的工作!新人...

UIImage的幾點建議

兩種初始化方式 1 uiimage imagenamed 適合 ui介面中反覆使用的貼圖,因為會儲存在 cache 中,所以速度會有保障。但是對使用次數較少,較大時候,不應這樣採用,因為會占用大量的 cache。2 uiimageimagewithcontentsoffile 直接從檔案中讀取,儲存...

初學的幾點建議

傲慢的上校 三 寫 想學好乙個技術,這一點必不可少,一定要自己動手寫。四 看 多看別人的 多學習下別人的設計思路,其實學習最好的教材就是android的源 了 至於如何獲得android源 可以看下我前面的文章 五 提問 有那麼多的好的論壇,還有那麼多的開發群,但是遇到問題先不要著急提問,自己先想辦...