Re: Переменные в

From: Oleg Bartunov <oleg(at)sai(dot)msu(dot)su>
To: Serik <uge(at)pochtamt(dot)ru>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Переменные в
Date: 2006-03-18 11:04:40
Message-ID: Pine.GSO.4.63.0603181401320.22593@ra.sai.msu.su
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

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

>
> Спасибо.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/docs/faq
>

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
>From pgsql-ru-general-owner(at)postgresql(dot)org Sat Mar 18 17:27:50 2006
X-Original-To: pgsql-ru-general-postgresql(dot)org(at)localhost(dot)postgresql(dot)org
Received: from localhost (av.hub.org [200.46.204.144])
by postgresql.org (Postfix) with ESMTP id 7F13F9DCCD4
for <pgsql-ru-general-postgresql(dot)org(at)localhost(dot)postgresql(dot)org>; Sat, 18 Mar 2006 17:27:49 -0400 (AST)
Received: from postgresql.org ([200.46.204.71])
by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024)
with ESMTP id 19873-01
for <pgsql-ru-general-postgresql(dot)org(at)localhost(dot)postgresql(dot)org>;
Sat, 18 Mar 2006 17:27:50 -0400 (AST)
Received: from svr4.postgresql.org (svr4.postgresql.org [66.98.251.159])
by postgresql.org (Postfix) with ESMTP id 25BD89DCC11
for <pgsql-ru-general(at)postgresql(dot)org>; Sat, 18 Mar 2006 17:27:47 -0400 (AST)
Received: from rex.antar.bryansk.ru (mx.online.bryansk.ru [195.239.214.81])
by svr4.postgresql.org (Postfix) with ESMTP id E57AC5AF060
for <pgsql-ru-general(at)postgresql(dot)org>; Sat, 18 Mar 2006 21:27:49 +0000 (GMT)
Received: from [195.239.214.85] (helo=dyatel.antar.bryansk.ru)
by rex.antar.bryansk.ru with esmtp (Exim 4.54 (FreeBSD))
id 1FKixc-0004g6-8p
for pgsql-ru-general(at)postgresql(dot)org; Sun, 19 Mar 2006 00:27:44 +0300
Received: from fduch by dyatel.antar.bryansk.ru with local (Exim 4.60 (FreeBSD))
(envelope-from <fduch(at)dyatel(dot)antar(dot)bryansk(dot)ru>)
id 1FKixc-000568-7O
for pgsql-ru-general(at)postgresql(dot)org; Sun, 19 Mar 2006 00:27:44 +0300
Date: Sun, 19 Mar 2006 00:27:44 +0300
From: "Alexander M. Pravking" <fduch(at)antar(dot)bryansk(dot)ru>
To: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: =?koi8-r?B?8MXSxc3F?=
Message-ID: <20060318212744(dot)GF97707(at)dyatel(dot)antar(dot)bryansk(dot)ru>
References: <200603181057(dot)k2IAvumN077473(at)www8(dot)pochta(dot)ru> <Pine(dot)GSO(dot)4(dot)63(dot)0603181401320(dot)22593(at)ra(dot)sai(dot)msu(dot)su>
Mime-Version: 1.0
Content-Type: text/plain; charset=koi8-r
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <Pine(dot)GSO(dot)4(dot)63(dot)0603181401320(dot)22593(at)ra(dot)sai(dot)msu(dot)su>
User-Agent: Mutt/1.5.11
X-Virus-Scanned: by amavisd-new at hub.org
X-Spam-Status: No, score=1.157 required=5 tests=[AWL=-0.386,
SUBJECT_ENCODED_TWICE=1.543]
X-Spam-Score: 1.157
X-Spam-Level: *
X-Archive-Number: 200603/6
X-Sequence-Number: 511

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 переменные.

Мне интересна эта тема, поскольку я в своё время не нашёл положительного
ответа на подобный вопрос, однако нашёл другой способ - через создание
временной таблицы, у которой срок жизни - как раз сессия. Однако такой
подход делает нагрузку на системные таблицы (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

--
Fduch M. Pravking

In response to

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Андрей Зевакин 2006-03-19 04:45:19 Re: Переме
Previous Message Serik 2006-03-18 10:57:56 Переменные в БД