[解決済み] PostgreSQLのROLE(ユーザー)が存在しない場合、それを作成する
質問
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
.
関連
-
[解決済み】SQLが単一グループのグループ関数でないこと
-
[解決済み] psql: FATAL: データベース "<user>" が存在しない
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] HTMLの "role "属性は何のためにあるのですか?
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み】PostgreSQLのエラーです。Fatal: ロール "username" が存在しません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Postgresのエラー。式として使用されるサブクエリによって返される複数の行
-
[解決済み] SQL Server サブクエリが 1 つ以上の値を返しました。これは、サブクエリが =, !=, <, <= , >, >= のように続く場合は許可されません。
-
[解決済み] ORA-01779: キーが保存されていないテーブルにマップされる列を変更できません。
-
[解決済み] Presto SQL ピボッティング(言葉は悪いですが)データ
-
[解決済み] Oracle(LiveSQL)のSQL [重複]について
-
[解決済み] varchar 値の変換で int カラムがオーバーフローしました。
-
[解決済み] ORA-00918: 列があいまいに定義されています」を解決する方法
-
[解決済み] CLOBとNCLOBの違いは何ですか?
-
[解決済み] マルチパート識別子をバインドできなかった
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?