【问题标题】:Update using stored procedure in postgres?在 postgres 中使用存储过程更新?
【发布时间】:2012-03-05 07:47:30
【问题描述】:

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

程序如下:

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

【问题讨论】:

  • 调用一个过程来构造字符串的开销并不大。以这种方式执行命令不应该增加太多开销。我认为新办公室政策的目的是通过确保可以检查针对它执行的所有内容来保护生产数据库。考虑到这一点,您的过程似乎确实违反了此政策,因为您基本上将一半的命令作为参数传递。
  • 这很奇怪,如果政策要求您这样做,最好将您的 SQL 通过电子邮件发送给 允许查询数据库的任何人。

标签: postgresql stored-procedures


【解决方案1】:

如果是 9.1,您可以使用 format() 使其更清晰:

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

【讨论】:

    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2013-11-27
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多