我试图在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文件进行测试,如果这有任何影响。

最佳答案

您应该使用:

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

Here you can find an explanation(尤其是阅读克雷格的答案)。
正如Erwin所说(谢谢),%I比%s更安全。无论如何,myarg应该在函数调用之前被验证。举个例子
SELECT myschema.test('something; stupid; here;')

10-07 12:35