SET

Name

SET -- 実行時パラメータの変更

Synopsis

SET [ SESSION | LOCAL ] variable { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }
  

入力

SESSION

現行セッションでコマンドを有効にすることを指定します。 (SESSIONLOCAL も指定されていない場合は、これがデフォルトです。)

LOCAL

現行のトランザクションでのみコマンドを有効にすることを指定します。 COMMIT または ROLLBACK の後、再びセッションレベルの設定が有効になります。 SET LOCALBEGIN ブロックの外側で実行されるとトランザクションは即座に終了するので、一見何も実行されていないように見えます。

variable

設定可能な実行時パラメータです。

value

パラメータの新しい値です。パラメータをデフォルト値に再設定するために DEFAULT を使うことができます。文字列のリストを使うこともできますが、その要素が複雑な場合、単一又は二重引用符で囲う必要があります。

説明

SET コマンドは実行時設定パラメータを変更します。 管理者用ガイドにリストされている実行時パラメータの多くは稼働中に SET コマンドで変更できます。 (しかし、変更するためにスーパーユーザ権限が必要な場合があります。また、サーバーあるいはセッションが始動した後には変更できないものもあります。) SET は現行セッションで使用される値のみに影響することに注意してください。

SET または SET SESSION が発行された後にトランザクションがアボートされると、SET コマンドの効力はそのトランザクションがロールバックされるときに失われます。 (この振る舞いは、PostgreSQL バージョン 7.3 での変更点です。7.3 より前のバージョンでは、後でエラーになっても SET の効果はロールバックしませんでした。) 一度トランザクションがコミットされるとその効果は、別の SET コマンドにオーバーライドされない限り、セッションが終了するまで持続します。

SET LOCAL の効果は、コミットの有無に関わらず現行のトランザクションが終了するまでしか持続しません。 1 つのトランザクション内で SET の後に SET LOCAL が続く場合は特別です。 トランザクションが終了するまでは SET LOCAL 値が有効ですが、その後 (トランザクションがコミットされると) SET 値が有効になります。

autocommitoff に設定されている場合でも、SET コマンドは新しいトランザクションブロックを開始しません。 詳細については、管理者用ガイドautocommit に関する節を参照してください。

設定可能なパラメータの例をさらにいくつか紹介します。

DATESTYLE

日付/時間表示様式を選択します。 2 つの個別の設定が含まれます。デフォルトの日付/時間出力と不明瞭な入力の解釈です。

以下は日付/時間出力の様式です。

ISO

ISO 8601 様式の日付と時間を使います。 (YYYY-MM-DD HH:MM:SS)。これがデフォルトです。

SQL

Oracle/Ingres 様式の日付と時間を使います。この様式は SQL (ISO 8601 様式を使っています)とは無関係で、このオプションの名前は歴史的偶然によってつけられました。

PostgreSQL

伝統的な PostgreSQL の形式を使います。

German

数値型の日付表示に dd.mm.yyyy を使います。

以下の二つのオプションは、"SQL" のサブスタイルと "PostgreSQL" の出力フォーマット、そして不明瞭な日付入力の好ましい解釈を決定します。

European

数値型の日付表示に dd/mm/yyyy を使います。

NonEuropean
US

数値型の日付表示に mm/dd/yyyy を使います。

SET DATESTYLE の値は最初のリスト(出力様式)、もしくは二番目のリスト(サブスタイル)のどれか、もしくはそれぞれのカンマで区切られたもののどれかを使うことが可能です。

SET DATESTYLE は入力の解釈に影響を与えるコマンドで、これによりいくつかの標準出力形式が提供されます。 入力/出力に関してさまざまなオプションあるいは厳密な制御を必要とするアプリケーションでは、関数の to_char ファミリーの使用を検討してください。

データ形式の設定には、SET または設定ファイル項目を使用した通常の方法以外に、現在では使われていない古い方式もいくつかあります。

postmaster の環境変数 PGDATESTYLE を設定します。 (この方法は他のすべての方法によってオーバーライドされます)
日付を European 規定に設定するようにオプション -o -e を使って postmaster を起動します。 (この方法は環境変数および設定ファイル項目をオーバーライドします。)
クライアントの環境変数 PGDATESTYLE を設定します。 libpq を基礎としたクライアントのフロントエンド環境に PGDATESTYLE が設定されている場合、libpq は接続の開始中に DATESTYLEPGDATESTYLE の値に自動的に設定します。 これは手動で SET DATESTYLE を発行するのと同じことです。

NAMES

SET NAMESSET CLIENT_ENCODING の別名です。

SEED

乱数発生のための内部シードを設定します。

value

random 関数が使うシードの値です。 使用可能な値は 0 から 1 までの浮動小数点数で、この値はその後 231-1 で積算されます。

シードは setseed SQL 関数を呼び出すことによっても設定できます。

SELECT setseed(value);
       

SERVER_ENCODING

サーバ側のマルチバイト符号化を示します。(符号化は initdb 時に決定されるので、現在このパラメータは表示されますが設定はできません。)

TIME ZONE
TIMEZONE

セッションにおけるデフォルトのタイムゾーンを設定します。 引数は、SQL 時間間隔定数、整数または浮動小数精度の定数、ホストのオペレーティングシステムが認識するタイムゾーンを表す文字列のいずれかを指定することができます。

ここではタイムゾーン設定のいくつかの一般的な有効値を挙げます。

'PST8PDT'

タイムゾーンをカリフォルニア州バークレイに設定します。

'Portugal'

タイムゾーンをポルトガルに設定します。

'Europe/Rome'

タイムゾーンをイタリアに設定します。

7

GMTから西に7時間分ずらしたタイムゾーンに設定します。 (PDT と同じです。)

INTERVAL '08:00' HOUR TO MINUTE

GMTから西に8時間分ずらしたタイムゾーンに設定します。 (PST と同じです。)

LOCAL
DEFAULT

タイムゾーンをユーザのローカルタイムゾーン(使用しているオペレーティングシステムがデフォルトで設定されているもの) に設定します。

使用可能なタイムゾーン名は、オペレーティングシステムによって異なります。 例えば、Linux では /usr/share/zoneinfo がタイムゾーンのデータベースを持っています。このディレクトリ内のファイル名は、このコマンドのパラメータとして使用できます。

もし無効なタイムゾーンが指定されると、タイムゾーンは(ほとんどのシステムでいいかげんながらも)GMT に設定されます。

libpq を基礎としたクライアントのフロントエンド環境に PGTZ 環境変数が設定されている場合、libpq は接続の開始時に SET TIMEZONEPGTZ の値に設定します。

現在のパラメータの設定を表示するために SHOW を使います。

診断

SET

成功した時に返されるメッセージです。

ERROR: 'name は有効なオプション名ではありません。

設定しようとしたパラメータは存在しません。

ERROR: '」name':permission denied

特定の設定を変更するにはスーパーユーザでなくてはなりません。

ERROR: 'name' cannot be changed after server start

サーバが起動されると、いくつかのパラメータが固定されます。

日付の様式を伝統的 PostgreSQL の European 形式に設定します。

SET DATESTYLE TO PostgreSQL,European;
   

タイムゾーン名のスペルを大文字のままにするために引用符を使用して、カリフォルニア州バークレイのタイムゾーンを設定します (この例では PostgreSQL のデータ形式を使用しています)。

SET TIME ZONE 'PST8PDT';
SELECT CURRENT_TIMESTAMP AS today;
               today
------------------------------------
 Tue Feb 26 07:32:21.42834 2002 PST
   

タイムゾーンをイタリアに設定します (特別な文字を扱うために単一引用符が必要であることに注意して下さい)。

SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;

             today
-------------------------------
 2002-10-08 05:39:35.008271+02
   

互換性

SQL92

SET TIME ZONE は、SQL9x で定義されている構文を拡張したものです。 SQL9x では、数値のタイムゾーンオフセットしか使用できないのに対し、PostgreSQL では、タイムゾーンのすべての指定子文字列を使用することができます。 他のすべての SET 機能は PostgreSQL の拡張です。

関連項目

関数 set_config でも同等の機能を提供しています。 PostgreSQL ユーザガイドその他の関数の節を参照してください。