我想创建一个将包含变量的脚本,_user
并且 仅 当尚不存在这种登录名
时才_pass
在Postgres数据库中创建用户。我以为这会起作用,但是我不能说出问题所在: __
DO
$DO$
DECLARE
_user TEXT := 'myuser';
_pass TEXT := 'user!pass';
BEGIN
IF NOT EXISTS ( SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = _user) THEN
RAISE NOTICE 'Creating user % ...',_user;
CREATE USER _user WITH
LOGIN
NOSUPERUSER
CREATEDB
CREATEROLE
NOREPLICATION
PASSWORD _pass;
RAISE NOTICE 'Created user %',_user;
ELSE
RAISE NOTICE 'User % already exists, not creating it',_user;
END IF;
END
$DO$
如何强制用变量内容替换变量?
而且$DO$
和之间有什么区别$$
?
要参数化标识符或语法元素,通常需要将动态SQL与EXECUTE
-最好结合使用,format()
以易于使用。
但实用的命令(包括所有SQL DDL语句)不允许值或参数替换的传递 在所有 。您需要先连接完整的语句,然后再执行它。看:
您的代码将像这样工作:
DO
$do$
DECLARE
_user text := 'myuser';
_pass text := 'user!pass';
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = _user) THEN
EXECUTE format(
'CREATE USER %I WITH
LOGIN
NOSUPERUSER
CREATEDB
CREATEROLE
NOREPLICATION
PASSWORD %L'
, _user
, _pass
);
RAISE NOTICE 'Created user "%"', _user;
ELSE
RAISE NOTICE 'User "%" already exists, not creating it', _user;
END IF;
END
$do$
但是,尽管无论如何都对_user
和_pass
进行了硬编码,但您可以像下面的示例所示进行简化:
而且
$DO$
和之间有什么区别$$
?
看:
问题内容: 在Groovy中是否可以使用匿名代码块?例如,我正在尝试将以下Java代码转换为Groovy: 我能想到的最接近的翻译如下: 我知道匿名代码块通常是一种反模式。但是具有类似“ inputStream0”和“ inputStream1”之类的变量的变量也是一种反模式,因此对于我正在处理的这段代码,匿名代码块会有所帮助。 问题答案: 您可以在Groovy中使用匿名代码块,但这些代码和闭包之
问题内容: Java中是否有匿名代码块的实际用途? 请注意,这与命名块无关,即 。 问题答案: 它们限制变量范围。 但是,实际上,如果你发现自己使用了这样的代码块,则可能是你要将其重构为方法的信号。
可能重复: 什么是双大括号初始化在Java? 在查看一些遗留代码时,我遇到了一些非常令人困惑的问题: 在调试模式下运行代码后,我发现匿名块是在调用构造函数之后调用的。上面的功能和做的有什么不同: ?我会认为它们在功能上是等价的,并且会认为后一种方式是更好/更干净的编写代码的方式。
问题内容: 我在玩PHP中的匿名函数,并意识到它们似乎并没有到达它们之外的变量。有什么办法可以解决这个问题? 例: 这将输出“无”。匿名函数有什么方法可以访问? 问题答案: 是的,使用闭包: 请注意,为了使您能够在匿名函数范围之外修改和检索修改后的值,必须在闭包中使用对其进行引用。
我在PHP中使用匿名函数,发现它们似乎无法访问外部变量。有什么办法可以绕过这个问题吗? 示例: 这将输出“nothing”。匿名函数有没有办法访问变量?
要为数据库创建授权,我使用以下salt模块 但它创造了我这个 即它为我创建了这个赠款 将keystone.*上的所有特权授予keystone@localhost 但我需要创建这个赠款 将keystone.*上的所有特权授予由“password”标识的“keystone”@“localhost”; 有人能建议我如何使用SaltStack添加带有密码的授权吗