Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-ru-general by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group