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コマンドを使用してのみ調整できるパラメータや特殊な構文を持つパラメータがいくつかあります。
SCHEMASET SCHEMA 'はvalue'SET search_path TO の別名です。
この構文を使用する場合は1つのスキーマのみを指定することができます。
value
NAMESSET NAMES は、valueSET client_encoding TO の別名です。
value
SEED
乱数ジェネレータ(random関数)用の内部シードを設定します。
-1から1までの浮動小数点数を値として設定できます。その後、この値には231-1がかけられます。
シードはsetseed関数を呼び出すことでも設定可能です。
SELECT setseed(value);
TIME ZONESET TIME ZONE はvalueSET timezone TO の別名です。
valueSET TIME ZONE構文では、時間帯の指定に特殊な構文を使用できます。
有効な値の例を以下に示します。
'PST8PDT'カリフォルニア州バークレイ用の時間帯です。
'Europe/Rome'イタリア用の時間帯です。
-7UTCから西に7時間分ずらした時間帯です(PDTと同じです)。 正の値はUTCから東方向です。
INTERVAL '-08:00' HOUR TO MINUTEUTCから西に8時間分ずらした時間帯です(PSTと同じです)。
LOCALDEFAULT
時間帯をユーザのローカルな時間帯(サーバのデフォルトの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の拡張です。