root/traduc/branches/bv747/manuel/ref/create_rule.sgml

Revision 32, 9.1 kB (checked in by gleu, 3 years ago)

Relecture IX de Thomas Silvi.

Line 
1 <!--
2 $Header: /var/lib/cvs/pgsql-fr/sgml/ref/create_rule.sgml,v 1.7.2.1 2005/03/14 06:03:01 guillaume Exp $
3 PostgreSQL documentation
4 -->
5
6 <refentry id="SQL-CREATERULE">
7  <refmeta>
8   <refentrytitle id="sql-createrule-title">CREATE RULE</refentrytitle>
9   <refmiscinfo>SQL - Instructions du langage</refmiscinfo>
10  </refmeta>
11
12  <refnamediv>
13   <refname>CREATE RULE</refname>
14   <refpurpose>définit une nouvelle règle de réécriture</refpurpose>
15  </refnamediv>
16
17  <indexterm zone="sql-createrule">
18   <primary>CREATE RULE</primary>
19  </indexterm>
20
21  <refsynopsisdiv>
22 <synopsis>
23 CREATE [ OR REPLACE ] RULE <replaceable class="parameter">nom</replaceable> AS
24 ON <replaceable class="parameter">événement</replaceable>
25     TO <replaceable class="parameter">table</replaceable> [ WHERE <replaceable class="parameter">condition</replaceable> ]
26     DO [ INSTEAD ] { NOTHING | <replaceable
27 class="parameter">commande</replaceable> | ( <replaceable
28 class="parameter">commande</replaceable> ; <replaceable
29 class="parameter">commande</replaceable> ... ) }
30 </synopsis>
31  </refsynopsisdiv>
32
33  <refsect1>
34   <title>Description</title>
35
36   <para>
37    <command>CREATE RULE</command> définit une nouvelle règle s'appliquant à une
38    table ou à une vue. <command>CREATE OR REPLACE RULE</command> soit créera une
39    nouvelle règle soit remplacera une règle existante du même nom pour la même
40    table.
41   </para>
42
43   <para>
44    Le système de règles de <productname>PostgreSQL</productname> autorise la
45    définition d'actions alternatives à réaliser sur les insertions, mises à jour
46    ou suppressions dans les tables de la base de données. Directement, une règle
47    fait que des commandes supplémentaires soient exécutées lorsqu'une commande
48    donnée est exécutée sur une table donnée. Autrement dit, une règle peut
49    remplacer une commande donnée par un autre ou faire qu'une commande ne soit
50    pas exécutée du tout. Les règles sont aussi utilisées pour implémenter les
51    vues de tables. Il est important de réaliser qu'une règle est réellement un
52    mécanisme de transformation de commandes. La transformation survient avant le
53    début de l'exécution de la commande. Si vous voulez réellement une opération
54    qui s'exécute indépendamment pour chaque ligne physique, vous voulez
55    probablement utiliser un déclencheur et non pas une règle. Plus
56    d'informations sur le système des règles se trouvent dans <xref
57    linkend="rules">.
58   </para>
59  
60   <para>
61    Actuellement, les règles <literal>ON SELECT</literal> doivent être des règles
62    <literal>INSTEAD</literal> sans condition et doivent avoir des actions
63    consistant en une simple commande <command>SELECT</command>. Du coup, une
64    règle <literal>ON SELECT</literal> transforme réellement la table en une vue
65    dont le contenu visible est les lignes renvoyées par la commande
66    <command>SELECT</command> de la règle plutôt que les lignes qui sont stockées
67    dans la table (si elles existent). Il est mieux considéré d'écrire une
68    commande <command>CREATE VIEW</command> plutôt que de créer une vraie table
69    et de définir une règle <literal>ON SELECT</literal> sur elle.
70   </para>
71
72   <para>
73    Vous pouvez créer l'illusion d'une vue pouvant être mise à jour en
74    définissant les règles <literal>ON INSERT</literal>, <literal>ON
75    UPDATE</literal> et <literal>ON DELETE</literal> (ou tout sous-ensemble de
76    celles suffisantes à vos buts) pour remplacer les actions de mises à jour
77    sur la vue par des mises à jours appropriées sur les autres tables.
78   </para>
79
80   <para>
81    Voici une astuce si vous utilisez les règles conditionnelles pour les mises
82    à jour de vues&nbsp;: elle <emphasis>doit</> être une règle
83    <literal>INSTEAD</literal> sans condition pour chaque action que vous
84    souhaitez autoriser sur la vue. Si la règle est conditionnelle ou si elle
85    n'est pas <literal>INSTEAD</literal>, alors le système rejettera toutes
86    tentatives d'exécution de l'action de mise à jour parce qu'il pense qu'il
87    pourrait finir par essayer de réaliser l'action sur la table de la vue dans
88    certains cas. Si vous souhaitez gérer tous les cas utiles dans les règles
89    conditionnelles, vous pouvez&nbsp;; ajoutez seulement une règle <literal>DO
90    INSTEAD NOTHING</literal> sans condition pour vous assurer que le système
91    comprend qu'il ne sera jamais appelé pour modifier la table. Puis, rendez les
92    règles conditionnelles en non <literal>INSTEAD</literal>&nbsp;; dans les cas
93    où cela s'applique, elles ajoutent à l'action <literal>INSTEAD
94    NOTHING</literal> par défaut.
95   </para>
96  </refsect1>
97
98  <refsect1>
99   <title>Paramètres</title>
100
101   <variablelist>
102    <varlistentry>
103     <term><replaceable class="parameter">nom</replaceable></term>
104     <listitem>
105      <para>
106       Le nom d'une règle à créer. Elle doit être distincte du nom de toute autre
107       règle sur la même table. Les règles multiples sur la même table et le même
108       type d'événement sont appliquées dans l'ordre alphabétique des noms.
109      </para>
110     </listitem>
111    </varlistentry>
112
113    <varlistentry>
114     <term><replaceable class="parameter">événement</replaceable></term>
115     <listitem>
116      <para>
117       L'événement est un de ceux-ci&nbsp;: <literal>SELECT</literal>,
118       <literal>INSERT</literal>, <literal>UPDATE</literal> ou
119       <literal>DELETE</literal>.
120      </para>
121     </listitem>
122    </varlistentry>
123
124    <varlistentry>
125     <term><replaceable class="parameter">table</replaceable></term>
126     <listitem>
127      <para>
128       Le nom (pouvant être qualifié par le nom du schéma) de la table ou de la
129       vue où s'applique la règle.
130      </para>
131     </listitem>
132    </varlistentry>
133
134    <varlistentry>
135     <term><replaceable class="parameter">condition</replaceable></term>
136     <listitem>
137      <para>
138       Toute expression SQL conditionnelle (renvoyant le type
139       <type>boolean</type>). L'expression de condition ne peut pas
140       référer à une table autre que <literal>NEW</literal> et
141       <literal>OLD</literal> et ne peut pas contenir de fonction d'agrégat.
142      </para>
143     </listitem>
144    </varlistentry>
145
146    <varlistentry>
147     <term><replaceable class="parameter">commande</replaceable></term>
148     <listitem>
149      <para>
150       La où les commandes réalisant l'action de la règle. Les commandes valides
151       sont <literal>SELECT</literal>, <literal>INSERT</literal>,
152       <literal>UPDATE</literal>, <literal>DELETE</literal> ou
153       <literal>NOTIFY</literal>.
154      </para>
155     </listitem>
156    </varlistentry>
157   </variablelist>
158
159   <para>
160    À l'intérieur d'une <replaceable class="parameter">condition</replaceable>
161    et d'une  <replaceable class="parameter">commande</replaceable>, les noms de
162    tables spéciales <literal>NEW</literal> et <literal>OLD</literal> pourraient
163    être utilisés pour se référer aux valeurs de la table référencée.
164    <literal>NEW</literal> est valide dans les règles <literal>ON
165    INSERT</literal> et <literal>ON UPDATE</literal> pour référencer la nouvelle
166    ligne en cours d'insertion ou de mise à jour. <literal>OLD</literal> est
167    valide dans les règles <literal>ON UPDATE</literal> et <literal>ON
168    DELETE</literal> pour référencer la ligne existante en cours de modification
169    ou de suppression.
170   </para>
171  </refsect1>
172
173  <refsect1>
174   <title>Notes</title>
175
176   <para>
177    Vous devez avoir le droit <literal>RULE</literal> sur une table pour être
178    autorisé à définir une règle sur elle.
179   </para>
180
181   <para>
182    Il est très important de faire attention aux règles circulaires. Par
183    exemple, bien que chacune des deux définitions de règles est acceptée par
184    <productname>PostgreSQL</productname>, la commande <command>SELECT</command>
185    fera que <productname>PostgreSQL</productname> rapportera une erreur parce
186    que la requête sera en boucle trop longtemps&nbsp;:
187
188 <programlisting>
189 CREATE RULE "_RETURN" AS
190     ON SELECT TO t1
191     DO INSTEAD
192         SELECT * FROM t2;
193
194 CREATE RULE "_RETURN" AS
195     ON SELECT TO t2
196     DO INSTEAD
197         SELECT * FROM t1;
198
199 SELECT * FROM t1;
200 </programlisting>
201   </para>
202
203   <para>
204    Actuellement, si l'action d'une règle contient une commande
205    <command>NOTIFY</command>, cette commande sera exécutée sans condition,
206    c'est-à-dire que le <command>NOTIFY</command> sera envoyé même si aucune
207    lignes de la règle ne s'applique. Par exemple, dans
208 <programlisting>
209 CREATE RULE notify_me AS ON UPDATE TO matable DO NOTIFY matable;
210
211 UPDATE matable SET name = 'foo' WHERE id = 42;
212 </programlisting>
213    un événement <command>NOTIFY</command> sera lancé durant un
214    <command>UPDATE</command>, qu'il y ait ou non des lignes satisfaisant la
215    condition <literal>id = 42</literal>. L'implémentation de cette restriction
216    pourrait être corrigée dans les prochaines versions.
217   </para>
218  </refsect1>
219
220  <refsect1>
221   <title>Compatibilité</title>
222
223   <para>
224    <command>CREATE RULE</command> est une extension du langage de
225    <productname>PostgreSQL</productname> ainsi que tout le système de règles.
226   </para>
227  </refsect1>
228 </refentry>
229
230 <!-- Keep this comment at the end of the file
231 Local variables:
232 mode: sgml
233 sgml-omittag:nil
234 sgml-shorttag:t
235 sgml-minimize-attributes:nil
236 sgml-always-quote-attributes:t
237 sgml-indent-step:1
238 sgml-indent-data:t
239 sgml-parent-document:nil
240 sgml-default-dtd-file:"../reference.ced"
241 sgml-exposed-tags:nil
242 sgml-local-catalogs:"/usr/lib/sgml/catalog"
243 sgml-local-ecat-files:nil
244 End:
245 -->
Note: See TracBrowser for help on using the browser.