SET — 実行時パラメータを変更する
SET [ SESSION | LOCAL ]configuration_parameter
{ TO | = } {value
| 'value
' | DEFAULT } SET [ SESSION | LOCAL ] TIME ZONE {timezone
| LOCAL | DEFAULT }
SET
コマンドは実行時設定パラメータを変更します。
第19章に列挙されている実行時パラメータの多くは稼働中にSET
コマンドで変更できます
(ただし、変更するためにスーパーユーザ権限が必要なものがあります。
また、サーバあるいはセッションの始動後は変更できないパラメータもあります)。
SET
は現行セッションで使用される値にのみ影響することに注意してください。
SET
(またはSET SESSION
も同じ)が発行された後にトランザクションがアボートされると、トランザクションがロールバックした時点でSET
コマンドの効力は失われます。
一度トランザクションがコミットされると、別のSET
コマンドで上書きされない限り、セッションが終了するまでその効果が持続します。
SET LOCAL
の効果は、コミットのされたかどうかにかかわらず現在のトランザクションが終了するまでしか持続しません。
1つのトランザクション内でSET
の後にSET LOCAL
が続く特殊な例を考えてみましょう。
この場合、トランザクションが終了するまではSET LOCAL
値が有効ですが、その後(トランザクションがコミットされたとして)SET
値が有効になります。
SET
もしくはSET LOCAL
の効果は、このコマンドより以前のセーブポイントまでロールバックした場合は取り消されます。
SET LOCAL
を同じ変数に対するSET
オプション(CREATE FUNCTIONを参照)を持つ関数内で使用する場合、SET LOCAL
コマンドの効果は関数終了時に消滅します。
つまり、関数が呼び出された時に有効だった値にとにかく戻されます。
これによりSET LOCAL
は、呼び出し元の値を保管し元に戻すというSET
オプションを使用する利点を持ちつつ、関数内で動的または繰り返し変更されるパラメータ用に使用できます。
しかし、通常のSET
コマンドでは上位の関数のSET
オプションを上書きしてしまい、その効果はロールバックしない限り永続します。
PostgreSQLバージョン8.0から8.2まででは、SET LOCAL
の効果は、より以前のセーブポイントを解放すること、または、PL/pgSQL例外ブロックから正常終了することで取り消されました。
直観的ではないようですので、この動作は変更されました。
SESSION
コマンドの有効範囲が現行セッションであることを指定します
(SESSION
もLOCAL
も指定されていない場合は、これがデフォルトです)。
LOCAL
コマンドの有効範囲が現行のトランザクションのみであることを指定します。
COMMIT
またはROLLBACK
の後は、再びセッションレベルの設定が有効になります。
これをトランザクションブロックの外側で実行すると、警告が発生しますが、それ以外には何の効果もありません。
configuration_parameter
設定可能な実行時パラメータ名です。 利用可能なパラメータは、第19章と以下に示します。
value
パラメータの新しい値です。
値として、文字列定数、識別子、数字、あるいはこれらをカンマで区切ったリストを対象のパラメータで適切となるように、指定することができます。
DEFAULT
と記述することで、パラメータをデフォルト値(つまり、現在のセッションでSET
が実行されなかった時に設定される値)に再設定することができます。
第19章に記載された設定パラメータの他に、SET
コマンドを使用してのみ調整できるパラメータや特殊な構文を持つパラメータがいくつかあります。
SCHEMA
SET SCHEMA '
はvalue
'SET search_path TO
の別名です。
この構文を使用する場合は1つのスキーマのみを指定することができます。
value
NAMES
SET NAMES
は、value
SET client_encoding TO
の別名です。
value
SEED
乱数ジェネレータ(random
関数)用の内部シードを設定します。
-1から1までの浮動小数点数を値として設定できます。その後、この値には231-1がかけられます。
シードはsetseed
関数を呼び出すことでも設定可能です。
SELECT setseed(value
);
TIME ZONE
SET TIME ZONE
はvalue
SET timezone TO
の別名です。
value
SET TIME ZONE
構文では、時間帯の指定に特殊な構文を使用できます。
有効な値の例を以下に示します。
'PST8PDT'
カリフォルニア州バークレイ用の時間帯です。
'Europe/Rome'
イタリア用の時間帯です。
-7
UTCから西に7時間分ずらした時間帯です(PDTと同じです)。 正の値はUTCから東方向です。
INTERVAL '-08:00' HOUR TO MINUTE
UTCから西に8時間分ずらした時間帯です(PSTと同じです)。
LOCAL
DEFAULT
時間帯をユーザのローカルな時間帯(サーバのデフォルトのtimezone
値)に設定します。
時間帯を数字あるいは時間で指定した時は、内部的にPOSIXの時間帯構文として解釈されます。
例えば、SET TIME ZONE -7
とした後、SHOW TIME ZONE
を実行すると、その結果は<-07>+07
となります。
時間帯に関する詳細は8.5.3を参照してください。
set_config
関数は等価な機能を提供します。
9.26を参照してください。
また、pg_settings
システムビューを更新することで、SET
と同じことを実行することができます。
スキーマの検索パスを設定します。
SET search_path TO my_schema, public;
日付のスタイルを、伝統的なPOSTGRES入力方式に設定し、さらに「day before month(月の前に日)」を使います。
SET datestyle TO postgres, dmy;
時間帯をカリフォルニア州バークレイに設定します。
SET TIME ZONE 'PST8PDT';
時間帯をイタリアに設定します。
SET TIME ZONE 'Europe/Rome';
SET TIME ZONE
は標準SQLで定義された構文を拡張したものです。
標準では数値による時間帯オフセットしか使用できないのに対し、PostgreSQLでは、より柔軟に時間帯を指定することができます。
SET
が持つその他の機能は、全てPostgreSQLの拡張です。