1. ホーム
  2. sql

[解決済み] PostgreSQLのROLE(ユーザー)が存在しない場合、それを作成する

2022-03-12 13:08:13

質問

PostgreSQL 9.1でROLEを作成するSQLスクリプトを、それが既に存在する場合にエラーを発生させずに記述するにはどうすればよいですか?

現在のスクリプトは、単に

CREATE ROLE my_user LOGIN PASSWORD 'my_password';

これは、ユーザーがすでに存在する場合は失敗します。のようなものを希望します。

IF NOT EXISTS (SELECT * FROM pg_user WHERE username = 'my_user')
BEGIN
    CREATE ROLE my_user LOGIN PASSWORD 'my_password';
END;

... でも、これではうまくいきません。 IF は、プレーンなSQLではサポートされていないようです。

PostgreSQL 9.1データベース、ロール、その他いくつかのものを作成するバッチファイルがあります。これはpsql.exeを呼び出し、実行するSQLスクリプトの名前を渡します。これまでのところ、これらのスクリプトはすべてプレーンSQLで、可能であればPL/pgSQLなどを避けたいと思っています。

どのように解決するのですか?

想定していたものと同様の方法で簡略化する。

DO
$do$
BEGIN
   IF NOT EXISTS (
      SELECT FROM pg_catalog.pg_roles  -- SELECT list can be empty for this
      WHERE  rolname = 'my_user') THEN

      CREATE ROLE my_user LOGIN PASSWORD 'my_password';
   END IF;
END
$do$;

(ビルドオン 馬の名前と名前なし の回答で、改善されました。 グレゴリーのコメント .)

とは異なり、例えば CREATE TABLE はありません。 IF NOT EXISTS の節は CREATE ROLE (少なくとも12ページ目まで)。そして、あなたは できない は、プレーンな SQL で動的 DDL ステートメントを実行します。

PL/pgSQLを避けたいという要望は、他のPLを使用する以外にはあり得ません。その DO ステートメント はデフォルトの手続き型言語としてplpgsqlを使用します。この構文では、明示的な宣言を省略することができます。

<ブロッククオート

DO [ LANGUAGE lang_name ] code
...
lang_name
コードが記述されている手続き言語の名前です。もし を省略した場合、デフォルトは plpgsql .