web-dev-qa-db-ja.com

postgresqlでグローバル変数を定義することは可能ですか?

Postgresql 9.4を使用していて、関数を記述しているときに、自己定義のerror_codes(int)を使用したいと思います。ただし後で正確な数値を変更したい場合があります
例えば
-1はUSER_NOT_FOUNDを意味します。
-2はUSER_DOES_NOT_HAVE_PERMISSIONを意味します。

これらをテーブルcodes_table(code_name :: text、code_value :: integer)で定義し、次のように関数で使用できます。

(SELECT codes_table.code_value FROM codes_table WHERE codes_table.code_name = 'USER_NOT_FOUND')

これには別の方法がありますか。多分グローバル変数?

7
Nuri Tasdemir

@ klinの回答 に基づいて、現在のセッションを超えて構成パラメーターを永続化する方法がいくつかあります。これらにはスーパーユーザー特権が必要であることに注意してください。

特定のデータベースへのすべての接続に値を設定するには:

ALTER DATABASE db SET abc.xyz = 1;

9.4で追加された ALTER SYSTEM コマンドを使用して、サーバー全体の値を設定することもできます。現在のセッションですでにSETになっている場合にのみ、ユーザー定義パラメーターに対して機能するようです。これを有効にするには、構成のリロードが必要であることにも注意してください。

SET abc.xyz = 1;
ALTER SYSTEM SET abc.xyz = 1;
SELECT pg_reload_conf();

9.4より前では、サーバーのpostgresql.confファイルにパラメーターを追加することで同じことを実行できます。 9.1以前では、 カスタム変数クラス も登録する必要があります。

5
Nick Barnes

Postgresにはグローバル変数がありません。ただし、カスタム構成パラメーターを定義できます。わかりやすくするために、glbなどのプレフィックスを付けて独自のパラメータを定義します。

この単純な関数により、クエリにパラメータを簡単に配置できます。

create or replace function glb(code text)
returns integer language sql as $$
    select current_setting('glb.' || code)::integer;
$$;

set glb.user_not_found to -1;
set glb.user_does_not_have_permission to -2;

select glb('user_not_found'), glb('user_does_not_have_permission');

ユーザー定義パラメーターはセッション内でローカルであるため、パラメーターは各セッションの開始時に定義する必要があります。

4
klin

あなたはこれを使うことができます

CREATE OR REPLACE FUNCTION globals.maxCities()
  RETURNS integer AS
  $$SELECT 100 $$ LANGUAGE sql IMMUTABLE;

..そしてコードでglobals.maxCities()を直接使用します。

2
Srinivas Rao

トリックを使用して、変数を1行のCTEとして宣言し、それを残りの部分にクロス結合することができます。例を参照してください。

WITH
variables AS (
    SELECT 'value1'::TEXT AS var1, 10::INT AS var2
)
SELECT t.*, v.*
FROM
    my_table AS t
    CROSS JOIN variables AS v
WHERE t.random_int_column = var2;
1
Joe Samanek

Postgresqlは、DBレベルのグローバル変数をサポートしていません。追加してみませんか:

CREATE TABLE global_variables (
  key text not null PRIMARY KEY
  value text
);

INSERT INTO global_variables (key, value) VALUES ('error_code_for_spaceship_engine', '404');

異なるタイプが値である可能性がある場合は、JSONをvalueのタイプと見なしますが、タイプごとに逆シリアル化コードが必要です。

0
AlexGordon