我正在尝试在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
没有被解释为创建角色?
如果有任何影响,请使用phpPgAdmin通过sql文件进行测试。
答案 0 :(得分:1)
您应该使用:
EXECUTE FORMAT('CREATE ROLE %I', myarg);
Here you can find an explanation(特别是阅读克雷格的答案)。
正如欧文所说(感谢),%I比%s更安全。无论如何,应该在函数调用之前验证 myarg 。试试例子
SELECT myschema.test('something; stupid; here;')