当前位置: 首页 > 面试题库 >

从匿名块中的变量创建带有密码的用户

南门展
2023-03-14
问题内容

我想创建一个将包含变量的脚本,_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语句)不允许值或参数替换的传递 在所有 。您需要先连接完整的语句,然后再执行它。看:

  • plpgsql中的“ XECUTE .. USING ..;”语句中没有“ RROR:没有参数$ 1”。

您的代码将像这样工作:

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进行了硬编码,但您可以像下面的示例所示进行简化:

  • 创建PostgreSQL ROLE(用户)(如果不存在)

而且$DO$和之间有什么区别$$

看:

  • PL / pgSQL中的“ $$”是什么


 类似资料:
  • 问题内容: 在Groovy中是否可以使用匿名代码块?例如,我正在尝试将以下Java代码转换为Groovy: 我能想到的最接近的翻译如下: 我知道匿名代码块通常是一种反模式。但是具有类似“ inputStream0”和“ inputStream1”之类的变量的变量也是一种反模式,因此对于我正在处理的这段代码,匿名代码块会有所帮助。 问题答案: 您可以在Groovy中使用匿名代码块,但这些代码和闭包之

  • 问题内容: Java中是否有匿名代码块的实际用途? 请注意,这与命名块无关,即 。 问题答案: 它们限制变量范围。 但是,实际上,如果你发现自己使用了这样的代码块,则可能是你要将其重构为方法的信号。

  • 可能重复: 什么是双大括号初始化在Java? 在查看一些遗留代码时,我遇到了一些非常令人困惑的问题: 在调试模式下运行代码后,我发现匿名块是在调用构造函数之后调用的。上面的功能和做的有什么不同: ?我会认为它们在功能上是等价的,并且会认为后一种方式是更好/更干净的编写代码的方式。

  • 问题内容: 我在玩PHP中的匿名函数,并意识到它们似乎并没有到达它们之外的变量。有什么办法可以解决这个问题? 例: 这将输出“无”。匿名函数有什么方法可以访问? 问题答案: 是的,使用闭包: 请注意,为了使您能够在匿名函数范围之外修改和检索修改后的值,必须在闭包中使用对其进行引用。

  • 我在PHP中使用匿名函数,发现它们似乎无法访问外部变量。有什么办法可以绕过这个问题吗? 示例: 这将输出“nothing”。匿名函数有没有办法访问变量?

  • 要为数据库创建授权,我使用以下salt模块 但它创造了我这个 即它为我创建了这个赠款 将keystone.*上的所有特权授予keystone@localhost 但我需要创建这个赠款 将keystone.*上的所有特权授予由“password”标识的“keystone”@“localhost”; 有人能建议我如何使用SaltStack添加带有密码的授权吗