CREATE FUNCTION create_user_if_not_exists(_name text, _pass text)
RETURNS void AS
$func$
DECLARE
_dbname TEXT := concat(_name, '_db');
BEGIN
IF EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = _name) THEN
RAISE NOTICE 'Role already exists. Skipping.';
ELSE
CREATE USER _name WITH encrypted password '_pass';
GRANT ALL PRIVILEGES ON DATABASE _dbname TO _name;
END IF;
END
$func$ LANGUAGE plpgsql;
当我跑步时:
psql --username "$POSTGRES_USER" -c "SELECT create_user_if_not_exists('Foo', 'BAR');"
我得到:
ERROR: database "_dbname" does not exist
如果注释掉这GRANT ALL
部分,我最终会得到一个名为 的用户_name
。pg_catalog.pg_roles
我怀疑_
这是造成这种情况的原因,但其他语法也一样。添加_name
和_pass
并DECLARE
不会改变任何事情。
为什么在这种情况下_name
, 、_pass
和_dbname
会被解释为值而不是真正的变量?这是函数定义的问题,还是对GRANT
和有一些限制,CREATE
或者因为我用 调用这个函数的方式psql
?
环境:psql (PostgreSQL) 17.4 (Debian 17.4-1.pgdg120+2)