我想创建一个通过JDBC不存在的数据库.与MySQL不同,PostgreSQL不支持create if not exists语法.完成此任务的最佳方法是什么?
应用程序不知道数据库是否存在.它应该检查,如果数据库存在,应该使用它.因此,连接到所需数据库是有意义的,如果由于数据库不存在而导致连接失败,则应创建新数据库(通过连接到默认postgres数据库).我检查了Postgres返回的错误代码,但我找不到任何相同的相关代码.
实现此目的的另一种方法是连接到postgres数据库并检查是否存在所需的数据库并相应地采取措施.第二个是锻炼有点乏味.
有什么方法可以在Postgres中实现这个功能吗?
我想PL/pgSQL通过psql命令行将参数传递给匿名块,然后在条件中检查该参数。
SQL 的相关部分在这里:
do $$
begin
    if (':para' = 1) then
        -- statements;
    end if;
end $$
;
我这样称呼这个脚本:
psql -d dbname -v para=1 < script.sql
我收到错误:
ERROR:  invalid input syntax for integer: ":para"
LINE 1: SELECT (':para' = 1)
            ^
QUERY:  SELECT (':para' = 1)
CONTEXT:  PL/pgSQL function inline_code_block line 3 at IF
我尝试使用 case/when 范式,这也不起作用。
我猜psql参数与 PL/pgSQL 不兼容?最终,我的目标是,delete如果我1作为psql参数传递,则运行单个语句,如果传递0.
我想创建一个包含变量的脚本,_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$还有和之间有什么区别$$?
我很少有 CREATE 用户作为 myquery.sql 文件的一部分,并且它也包含很少的其他查询
我的文件看起来像这样
CREATE USER myuser NOLOGIN;
GRANT CONNECT on DATABSE myDataBase to myuser;
GRANT USAGE ON SCHEAMA myschema to myuser;
我在同一个文件中很少有这样的查询,由于某种原因,我需要向同一个文件添加新查询,当再次执行同一个文件时,我坚持错误用户已经存在,并且无法到达新添加的查询。
我还检查了 postgres 中没有 IF NOT EXISTS 类型的 CREATE USER 帮助。
那么如何添加检查以仅在不存在时创建用户。