Re: Переме - Mailing list pgsql-ru-general

From Oleg Bartunov
Subject Re: Переме
Date
Msg-id Pine.GSO.4.63.0603190917300.6686@ra.sai.msu.su
Whole thread Raw
In response to Переменные в БД  (Serik <uge@pochtamt.ru>)
List pgsql-ru-general
On Sun, 19 Mar 2006, Alexander M. Pravking wrote:

> On Sat, 2006-03-18 at 14:04 +0300, Oleg Bartunov wrote:
>> On Sat, 18 Mar 2006, Serik wrote:
>>
>>> Добрый день !
>>> Можно в PostgreSQL объявлять свои переменные , типа client_encoding,
>>> timezone и т.д.,
>>> чтобы их значения были видны только одному пользователю в пределах сессии ?
>>
>> можно, set client_encoding = 'koi8=r';
>> А можно еще и документацию почитать.
>> http://www.postgresql.org/docs/8.1/static/sql-set.html
>
> Скорее всего, имелись в виду не PG'шные встроенные, а именно
> user-defined переменные.

не уверен, но по твоей теме был тред

http://www.pgsql.ru/db/pgsearch/index.html?group=1&page=1&site=archives.postgresql.org%2F&tmpl=%F0%D2%C9%D7%C5%D4&q=session%20variables&ps=10
Там через view реализовано

>
> Мне интересна эта тема, поскольку я в своё время не нашёл положительного
> ответа на подобный вопрос, однако нашёл другой способ - через создание
> временной таблицы, у которой срок жизни - как раз сессия. Однако такой
> подход делает нагрузку на системные таблицы (pg_class, pg_attribute),
> что иногда заметно сказывается на производительности. Так что было бы
> неплохо, если бы в PG появился более стандартный способ.
>
> Привожу функции для управления такими "переменными":
>
>
> CREATE OR REPLACE FUNCTION get_session_var(text) RETURNS text AS '
> DECLARE
>     _x    record;
> BEGIN
>     SELECT    1 INTO _x FROM pg_class
>     WHERE    relname = ''session_vars''
>     AND    relkind = ''r''
>     AND    CASE WHEN has_schema_privilege(relnamespace,''USAGE'')
>             THEN pg_table_is_visible(oid)
>             ELSE false
>         END;
>
>     IF NOT FOUND THEN RETURN NULL; END IF;
>
>     FOR _x IN EXECUTE ''SELECT value FROM session_vars WHERE var = '' || quote_literal($1)
>     LOOP
>         RETURN _x.value;
>     END LOOP;
>     RETURN    NULL;
> END' LANGUAGE 'plPgSQL' STRICT;
>
>
> CREATE OR REPLACE FUNCTION set_session_var(text, text) RETURNS text AS '
> DECLARE
>     _x    integer;
> BEGIN
>     SELECT    1 INTO _x FROM pg_class
>     WHERE    relname = ''session_vars''
>     AND    relkind = ''r''
>     AND    CASE WHEN has_schema_privilege(relnamespace,''USAGE'')
>             THEN pg_table_is_visible(oid)
>             ELSE false
>         END;
>
>     IF NOT FOUND THEN
>         EXECUTE ''CREATE TEMP TABLE session_vars (var text, value text) WITHOUT OIDS'';
>     ELSE
>         EXECUTE ''DELETE FROM session_vars WHERE var = ''||quote_literal($1);
>     END IF;
>     EXECUTE ''INSERT INTO session_vars VALUES ('' ||
>         quote_literal($1) || '', '' || coalesce(quote_literal($2), ''NULL'') ||
>         '')'';
>     RETURN $2;
> END' LANGUAGE 'plPgSQL';
>
>
>
> Замечу также, что проверка pg_table_is_visible() без has_schema_privilege()
> в функциях недостаточна, на этот счёт я уже писал в -hackers:
>
> http://archives.postgresql.org/pgsql-hackers/2005-06/msg00319.php
>
>
>

     Regards,
         Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83

pgsql-ru-general by date:

Previous
From: Андрей Зевакин
Date:
Subject: Re: Переме
Next
From: "Федоров Михаил Вячеславович"
Date:
Subject: Дистрибутив по email?