我试图在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;')