2012-03-05 24 views
2

我希望我的存儲過程允許用戶更新數據。在postgres中使用存儲過程更新?

這裏的程序:

CREATE OR REPLACE FUNCTION update_table (
    IN _table  character varying, 
    IN _col_mod character varying, 
    IN _val_mod character varying, 
    IN _col_filter character varying, 
    IN _val_filter character varying 
) 
RETURNS void 
AS 
$$ 
BEGIN 
    RAISE NOTICE 'Update table %', _table; 
    EXECUTE ' UPDATE ' || quote_ident(_table) || ' SET ' || quote_ident(_col_mod) || ' = $1 WHERE ' || quote_ident(_col_filter) || ' = $2' 
    USING _val_mod, _val_filter; 
END; 
$$ 
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER; 

我想問問,是這個程序是有效的?,因爲它看起來像我剛剛重新創建查詢。

而我之所以創建這樣一個過程的原因是在我的辦公室我有新的政策,DBA不允許直接執行查詢到數據庫中。我們必須使用存儲過程來執行DML數據檢索查詢。

在此先感謝..:d

+1

調用一個方法來構造字符串的開銷並不大。以這種方式執行命令不應該增加很多開銷。我認爲新的辦公室政策的目的是保護生產數據庫,確保對其執行的一切都可以檢查。考慮到這一點,你的過程似乎違反了這個政策,因爲你基本上將命令的一半作爲參數傳遞。 – 2012-03-05 09:58:52

+0

這很奇怪,如果這是政策要求你做的事情,那麼最好將你的SQL以電子郵件發送給允許查詢數據庫的人。 – tscho 2012-03-05 22:17:34

回答

3

如果是9.1,你可以使用format(),使之更加清晰:

EXECUTE format(
    'UPDATE %I SET %I = $1 WHERE %I = $2', _table, _col_mod, _col_filter 
    ) 
USING _val_mod, _val_filter; 
+0

+1格式()是完美的工具。 – 2012-03-07 00:19:49