postgresql - 从存储过程更新

标签 postgresql sql-injection plpgsql dynamic-sql

我需要创建一个存储过程,它可以将架构名称和表名称作为参数并在同一个表上进行更新。

CREATE OR REPLACE FUNCTION garscratch.update_table(schema_name text, table_name text ) RETURNS void as $$
DECLARE
 table TEXT;
BEGIN
execute 'update '||schema||'.'||table_name|| 'set id = substring(id from 1 for 2) where name = "test"';
END;
$$ LANGUAGE plpgsql;

当我执行上面的程序时:

select update_table(my,my_table);

我得到错误:

Column "my" does not exist.

它不会将“my”视为架构名称。

最佳答案

  • tablenameset 之间需要一个空格。
  • 您需要在值 'test' 周围加上单引号。
    或者,如果它应该是列名,则根本不需要引号。
  • 您需要清理标识符以避免 SQL 注入(inject)。

改用(完全重写):

CREATE OR REPLACE FUNCTION garscratch.update_table(_tbl regclass)
  RETURNS void AS
$func$
BEGIN
EXECUTE 'UPDATE ' || _tbl || $$ SET id = left(id, 2) WHERE name = 'test'$$;
END
$func$ LANGUAGE plpgsql;

调用:

SELECT garscratch.update_table('myschema.my_table');

详细解释:
Table name as a PostgreSQL function parameter

关于postgresql - 从存储过程更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22990377/

相关文章:

php - 旧的困惑 PHP 代码和 MySQL 注入(inject)

sql - 可以接受客户端 SQL 吗?如果可以,如何验证?

postgresql - 将函数应用于另一个函数内的临时表

sql - 用于填充记录集和返回 ID 的 Postgres 函数

python - 共享 txpostgres 连接池

mysql - Zend - 插入/更新时我需要使用 quote() 吗?

sql - 在单个 SELECT 查询中查找最大值的总和

sql - 在 postgresql json 字段中选择键的唯一值

node.js - 自定义 docker 图像未运行 postgres

使用 2 个表的 postgresql 触发器