函数参数未在体内解释
Function argument not interpreted inside body
我试图在 PostgreSQL 9.3.6 中创建一个 PL/pgSQL 函数,但是在函数体内使用传递的参数时出现奇怪的行为。这是 'very simple' 函数:
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
没有解释为创建角色?
正在通过 sql 个文件使用 phpPgAdmin 进行测试是否有任何影响。
你应该使用:
EXECUTE FORMAT('CREATE ROLE %I', myarg);
Here you can find an explanation(尤其是阅读 Craig 的回答)。
正如 Erwin 所说(感谢),%I 比 %s 更安全。无论如何,myarg 应该在函数调用之前进行验证。举个例子
SELECT myschema.test('something; stupid; here;')
我试图在 PostgreSQL 9.3.6 中创建一个 PL/pgSQL 函数,但是在函数体内使用传递的参数时出现奇怪的行为。这是 'very simple' 函数:
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
没有解释为创建角色?
正在通过 sql 个文件使用 phpPgAdmin 进行测试是否有任何影响。
你应该使用:
EXECUTE FORMAT('CREATE ROLE %I', myarg);
Here you can find an explanation(尤其是阅读 Craig 的回答)。
正如 Erwin 所说(感谢),%I 比 %s 更安全。无论如何,myarg 应该在函数调用之前进行验证。举个例子
SELECT myschema.test('something; stupid; here;')