在Postgres中使用存储过程进行更新?

3

我希望我的存储过程可以允许用户更新数据。

以下是该存储过程:

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
调用一个过程来构造一个字符串的开销并不大。以这种方式执行命令不应该增加太多开销。我推测新办公室政策的目的是通过确保对生产数据库执行的所有操作都可以被检查来保护它。考虑到这一点,你的过程似乎违反了这一政策,因为你基本上将一半的命令作为参数传递进去了。 - Philip Couling
这很奇怪,如果政策要求你这样做,也许最好将你的SQL通过电子邮件发送给那些被允许查询数据库的人。 - tscho
1个回答

3
如果版本是9.1,您可以使用format()函数使其更易读:
EXECUTE format(
    'UPDATE %I SET %I = $1 WHERE %I = $2', _table, _col_mod, _col_filter
    )
USING _val_mod, _val_filter;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接