2015-07-09 5 views
3

Я использую postgresql 9.4, и при написании функций я хочу использовать самоопределенные error_codes (int). Однако Возможно, я захочу изменить точные числовые значения позже.
Например,
-1 означает USER_NOT_FOUND.
-2 означает USER_DOES_NOT_HAVE_PERMISSION.
Можно ли определить глобальные переменные в postgresql

я могу определить их в таблице codes_table (code_name :: текст, code_value :: целое число) и использовать их в функциях следующим

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

Есть еще один способ для этого. Может быть, глобальные переменные?

+0

Просто придерживайтесь стола. Оберните его простой SQL-функцией, если нужно. На самом деле, хотя я не вижу смысла изменять ценности, почему бы просто не сделать их статичными? –

+0

@CraigRinger Мы разрабатываем новую систему, и для кодов ошибок будет установлен формат. Например, [-9 -1] предназначен для ошибок, связанных с разрешением, [-19, -10] для ошибок проверки ограничений. Однако этот формат пока не установлен. И, возможно, когда он будет установлен, позже он будет сброшен. Поэтому я хочу быть готовым. –

+0

это не коды ошибок, вы возвращаете коды ошибок с 'RAISE EXCEPTION' и достаточно свежими версиями, которые позволяют вам указать код, который вы поднимаете. – Jasen

ответ

2

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

определяемые пользователем параметры являются локальными в сеансе, поэтому параметры должны быть определены в начале каждой сессии.

+0

Эти параметры конфигурации могут выполнять эту работу. Однако есть ли способ сделать их постоянными (пока я их не изменю)? –

+0

К сожалению, нет. Но на практике простой начальный скрипт не является проблемой. – klin

+0

@Nuri: см. ['ALTER SYSTEM'] (http://www.postgresql.org/docs/9.4/static/sql-altersystem.html), новый в 9.4 –

1

Основываясь на @klin's answer, существует несколько способов сохранить параметр конфигурации за пределами текущего сеанса. Обратите внимание, что для этого требуются привилегии суперпользователя.

Чтобы установить значение для всех подключений к определенной базе данных:

ALTER DATABASE db SET abc.xyz = 1; 

Вы также можете установить общесерверное значение с помощью команды ALTER SYSTEM, добавил в 9.4. Кажется, что он работает только для пользовательских параметров, если они уже были SET в вашем текущем сеансе. Также обратите внимание, что для этого требуется перезагрузка конфигурации.

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

Pre-9.4, вы можете сделать то же самое, добавив параметр в postgresql.conf файл сервера. В 9.1 и ранее вам также необходимо зарегистрировать custom variable class.

+0

Я вижу значение с помощью SHOW abc.xyz. Однако я не мог использовать его в SELECT. Как я могу использовать его значение? –

+1

Используйте функцию из моего ответа (конечно, вы должны изменить префикс 'glb'). – klin

0

Вы можете использовать трюк и объявлять переменные как 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; 
+0

вы можете упростить «переменные CTE» с помощью переменных (var1, var2, trip_type_var as (values ​​('value1', 'value2', 'one')) ... ' –

Смежные вопросы