簡體   English   中英

是否可以在postgresql中定義全局變量

[英]Is it possible to define global variables in 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')

還有另一種方法嗎? 也許全局變量?

基於@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及更早版本中,您還需要注冊自定義變量類

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');

用戶定義的參數在會話中是本地的,因此應在每個會話開始時定義參數。

您可以使用技巧並將變量聲明為1行CTE,然后CROSS JOIN到其余部分。 見例子:

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;

你可以用它

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

..並在代碼中直接使用globals.maxCities()。

Postgresql不支持數據庫級別的全局變量。 為什么不添加它:

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 ,但隨后需要為每種類型的反串行化代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM