函数参数不在体内解释

时间:2015-04-06 10:44:41

标签: postgresql plpgsql dynamic-sql

我正在尝试在PostgreSQL 9.3.6中创建一个PL / pgSQL函数,但是在函数体内使用传递的参数时会有奇怪的行为。这是'非常简单'的功能:

CREATE OR REPLACE FUNCTION myschema.test (myarg text) RETURNS text AS $$
DECLARE
  entity text;
  buffer text;
BEGIN
    CREATE ROLE myarg;
    RETURN myarg;
END;
$$ LANGUAGE plpgsql;

因此,如果例如myarg等于'test':

  • 创建名为'myarg'的角色(错误)
  • 'test'返回(正确)

我搜索了几个小时,为什么这可能是没有线索...安全参数?为什么myarg没有被解释为创建角色?

如果有任何影响,请使用phpPgAdmin通过sql文件进行测试。

1 个答案:

答案 0 :(得分:1)

您应该使用:

EXECUTE FORMAT('CREATE ROLE %I', myarg);

Here you can find an explanation(特别是阅读克雷格的答案)。


正如欧文所说(感谢),%I比%s更安全。无论如何,应该在函数调用之前验证 myarg 。试试例子

SELECT myschema.test('something; stupid; here;')