Skip to content

Commit

Permalink
update rule for 17.0
Browse files Browse the repository at this point in the history
  • Loading branch information
koizumistr committed Feb 28, 2025
1 parent aceece4 commit d06c007
Showing 1 changed file with 13 additions and 30 deletions.
43 changes: 13 additions & 30 deletions doc/src/sgml/rules.sgml
Original file line number Diff line number Diff line change
Expand Up @@ -1172,15 +1172,10 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
or rewrite the query per a user-defined rule.
These options are discussed below.
-->
《マッチ度[89.233038]》ビューが<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>などの目的リレーションとして名付けられた場合はどうなるのでしょうか
ビューが<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>、<command>MERGE</command>などの対象リレーションとして名付けられた場合はどうなるのでしょうか
上で説明したような置換をすると、結果リレーションが副問い合わせの範囲テーブル項目を指す問い合わせツリーができてしまい、それは上手く機能しません。しかし、いくつかのケースでは<productname>PostgreSQL</productname>はビューの更新をサポートする事ができます。
ユーザエクスペリエンスの複雑さの順に、ビューから参照されているテーブルでの自動的な置換、ユーザ定義トリガの実行、ユーザ定義ルールごとの問い合わせの書き換えがあります。
これらのオプションについては、以下で説明します。
《機械翻訳》ビューが<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>、<command>MERGE</command>のターゲットリレーションとして記名的である場合はどうなりますか。
上記の置換を行うと、結果の問い合わせツリーがサブクエリレンジ-テーブルエントリを指しているリレーションが得られますが、これは機能しません。
ただし、いくつかの方法があります<productname>PostgreSQL</productname>サポートは更新の外観をビューにすることができます。
ユーザのオーダーで経験された複雑さは、ビューの基礎となるテーブルで自動的に置き換えること、実行でユーザ定義のトリガを置き換えること、ユーザ定義のルールごとにクエリを書き直すことである。
これらのオプションについては後述する。
</para>

<para>
Expand All @@ -1195,11 +1190,9 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
information on the kinds of view that can be automatically updated, see
<xref linkend="sql-createview"/>.
-->
《マッチ度[88.536155]》副問い合わせが単一の基底リレーションを参照しかつ十分に単純である時、リライタは副問い合わせを基となる基底リレーションに自動的に置き換え、したがって、<command>INSERT</command>、<command>UPDATE</command>あるいは<command>DELETE</command>を適切な方法で基底リレーションに適用する事ができます。
この場合の<quote>十分に単純</quote>なビューは<firstterm>自動的に更新可能</firstterm>であると呼ばれます。自動的に更新可能なビューに関するより詳細な情報については、<xref linkend="sql-createview"/>を参照してください。
《機械翻訳》サブクエリが単一の基本リレーションから選択され、シンプルが十分である場合、リライタは自動的にサブクエリを基礎となる基本リレーションに置き換えて、<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>、または<command>MERGE</command>が適切な方法で基本リレーションに適用されるようにすることができます。
そのための<quote>シンプルで十分な</quote>景色を<firstterm>自動的に更新可能</firstterm>と呼びます。
自動的に更新できるビューの種類の詳細については、<xref linkend="sql-createview"/>を参照してください。
副問い合わせが単一の基底リレーションを参照しかつ十分に単純である時、リライタは副問い合わせを基となる基底リレーションに自動的に置き換え、したがって、<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>あるいは<command>MERGE</command>を適切な方法で基底リレーションに適用できます。
この場合の<quote>十分に単純</quote>なビューは<firstterm>自動的に更新可能</firstterm>であると呼ばれます。
自動的に更新可能なビューに関するより詳細な情報については、<xref linkend="sql-createview"/>を参照してください。
</para>

<para>
Expand All @@ -1217,16 +1210,11 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
but another unexpanded range-table entry is added to the query
to represent the view in its capacity as the result relation.
-->
《マッチ度[87.603306]》もう一つの方法として、ビューに対するユーザ定義の<literal>INSTEAD OF</literal>トリガによってこれらのコマンドを処理する事ができます。この場合、書き換えは少々違う形で行われます
(<xref linkend="sql-createtrigger"/>を参照してください)。
もう一つの方法として、ビューに対するユーザ定義の<literal>INSTEAD OF</literal>トリガによってこれらのコマンドを処理できます(<xref linkend="sql-createtrigger"/>を参照してください)。
この場合、書き換えは少々違う形で行われます
<command>INSERT</command>に対しては、リライタはビューに全く何もせず、問い合わせの結果リレーションをそのままにします。
<command>UPDATE</command><command>DELETE</command>に対しては、コマンドが更新もしくは削除しようとする<quote>古い</quote>行を生成するためにビュー問い合わせを展開する必要がまだあります。
<command>UPDATE</command><command>DELETE</command>、<command>MERGE</command>に対しては、コマンドが更新もしくは削除しようとする<quote>古い</quote>行を生成するためにビュー問い合わせを展開する必要がまだあります。
そのため、ビューは通常通り展開されますが、もう一つの展開されない範囲テーブル項目が結果リレーションとしてビューを表す問い合わせに追加されます。
《機械翻訳》あるいは、オペレーションは、ビューのユーザ提供<literal>代わり</literal>トリガによって取り扱われてもよい(<xref linkend="sql-createtrigger"/>を参照)。
このケースでは、書き直しの動作が少し異なります。
<command>INSERT</command>の場合、リライタはビューに対して何も行わず、クエリの結果リレーションとして残します。
<command>UPDATE</command>、 <command>DELETE</command>、<command>MERGE</command>については、コマンドが更新、削除、マージに対して試みる<quote>古い</quote>行を生成するために、ビュークエリを拡張する必要があります。
したがって、ビューは通常どおり拡張ですが、拡張されていない別のレンジ-テーブルエントリがクエリに追加され、結果としてリレーションとしての能力でビューを表します。
</para>

<para>
Expand All @@ -1245,10 +1233,10 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
<literal>INSTEAD OF</literal> trigger. It is up to the trigger to work
out what to update based on the old and new row values.
-->
《マッチ度[90.697674]》ここで起こる問題はビューで更新される行をどのように特定するかということです。
ここで起こる問題はビューで更新される行をどのように特定するかということです。
結果リレーションがテーブルの場合、更新する行の物理的な位置を特定するために特別な<acronym>CTID</acronym>項目が目的リストに追加されることを思い出して下さい。
ビューの行には実際の物理的な位置がないため、ビューには<acronym>CTID</acronym>がありませんので、これは結果リレーションがビューの場合には上手くいきません。
その代わり、<command>UPDATE</command><command>DELETE</command>操作では、特別な<literal>行全体</literal>の項目が目的リストに追加されていて、それはビューからすべての列を含むように展開されています。
その代わり、<command>UPDATE</command><command>DELETE</command>、<command>MERGE</command>操作では、特別な<literal>行全体</literal>の項目が目的リストに追加されていて、それはビューからすべての列を含むように展開されています。
エグゼキュータはこの値を使って<quote>古い</quote>行を<literal>INSTEAD OF</literal>トリガに提供します。
新旧の行の値に基づいて更新するものを計算するのはトリガの責任です。
</para>
Expand All @@ -1264,14 +1252,10 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
<command>MERGE</command>, which currently does not support rules on
the target relation other than <command>SELECT</command> rules.
-->
《マッチ度[65.579710]》別の方法としては、ビューに対する<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>コマンドに代替の動作を指定する<literal>INSTEAD</literal>ルールを定義する事です。
別の方法としては、ビューに対する<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>コマンドに代替の動作を指定する<literal>INSTEAD</literal>ルールを定義する事です。
これらのルールは、ビューではなくコマンドを、通常は1つもしくは複数のテーブルを更新するコマンドに書き換えます。
それが<xref linkend="rules-update"/>の論題になります。
《機械翻訳》もう1つの可能性は、ユーザで<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>コマンドの代わりにアクションを指定する<literal>INSTEAD</literal>ルールをビューが定義することです。
これらのルールは、コマンドを、通常はビューではなく1つ以上のテーブルを更新するコマンドに書き換えます。
それは<xref linkend="rules-update"/>のトピックです。
ノートこれは<command>MERGE</command>では機能しません。
現在、<command>SELECT</command>ルール以外のターゲットリレーションではサポートルールがありません。
これは<command>MERGE</command>では機能しないことに注意してください。現在、<command>SELECT</command>ルール以外の対象リレーションでのルールをサポートしていません。
</para>

<para>
Expand All @@ -1296,9 +1280,8 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
triggers, they will override the default behavior of automatically
updatable views.
-->
《マッチ度[82.828283]》単純なビューに対する<command>INSERT</command>、<command>UPDATE</command>あるいは<command>DELETE</command>コマンドの自動書き換えは常に最後に試みられます。したがって、ビューがルールもしくはトリガを持っていた場合、これらは更新可能ビューのデフォルト動作を上書きします。
《機械翻訳》シンプルビューの<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>、<command>MERGE</command>クエリの自動書き換えは、常に最後に試行されます。
したがって、ビューにルールまたはトリガーがある場合、自動的に更新可能ビューのデフォルト動作は上書きになります。
単純なビューに対する<command>INSERT</command>、<command>UPDATE</command>、<command>DELETE</command>あるいは<command>MERGE</command>問い合わせの自動書き換えは常に最後に試みられます。
したがって、ビューがルールもしくはトリガを持っていた場合、これらは自動的に更新可能なビューのデフォルト動作を上書きします。
</para>

<para>
Expand Down

0 comments on commit d06c007

Please sign in to comment.