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

Revision 626, 17.9 kB (checked in by gleu, 2 years ago)

Mise à jour 7.4.17.

Line 
1 <!--
2 $Header: /var/lib/cvs/pgsql-fr/sgml/ref/create_function.sgml,v 1.7.2.1 2005/03/20 22:34:41 guillaume Exp $
3 -->
4
5 <refentry id="SQL-CREATEFUNCTION">
6  <refmeta>
7   <refentrytitle id="SQL-CREATEFUNCTION-TITLE">CREATE FUNCTION</refentrytitle>
8   <refmiscinfo>SQL - Instructions du langage</refmiscinfo>
9  </refmeta>
10
11  <refnamediv>
12   <refname>CREATE FUNCTION</refname>
13   <refpurpose>définit une nouvelle fonction</refpurpose>
14  </refnamediv>
15
16  <indexterm zone="sql-createfunction">
17   <primary>CREATE FUNCTION</primary>
18  </indexterm>
19
20  <refsynopsisdiv>
21 <synopsis>
22 CREATE [ OR REPLACE ] FUNCTION <replaceable class="parameter">nom</replaceable>
23 ( [ <replaceable class="parameter">type_arg</replaceable> [, ...] ] )
24     RETURNS <replaceable class="parameter">type_ret</replaceable>
25   { LANGUAGE <replaceable class="parameter">nomlang</replaceable>
26     | IMMUTABLE | STABLE | VOLATILE
27     | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
28     | [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
29     | AS '<replaceable class="parameter">definition</replaceable>'
30     | AS '<replaceable class="parameter">fichier_obj</replaceable>', '<replaceable class="parameter">symbole_lien</replaceable>'
31   } ...
32     [ WITH ( <replaceable class="parameter">attribut</replaceable> [, ...] ) ]
33 </synopsis>
34  </refsynopsisdiv>
35  
36  <refsect1 id="sql-createfunction-description">
37   <title>Description</title>
38
39   <para>
40    <command>CREATE FUNCTION</command> définit une nouvelle fonction.
41    <command>CREATE OR REPLACE FUNCTION</command> créera une nouvelle fonction
42    ou remplacera une fonction existante.
43   </para>
44
45   <para>
46    Si un nom de schéma est inclus, alors la fonction est créée dans le schéma
47    spécifié. Sinon, elle est créée dans le schéma courant. Le nom de la nouvelle
48    fonction ne doit pas correspondre à une autre fonction existante avec les
49    mêmes types d'argument dans le même schéma. Néanmoins, les fonctions de types
50    d'arguments différents pourraient partager un nom (ceci est appelé le
51    <firstterm>surchargement</>).
52   </para>
53
54   <para>
55    Pour mettre à jour la définition d'une fonction existante, utilisez
56    <command>CREATE OR REPLACE FUNCTION</command>. Il n'est pas possible de
57    changer le nom ou les types d'argument d'une fonction de cette façon (si vous
58    avez essayé, vous devrez seulement créer une nouvelle fonction distincte). De
59    même, <command>CREATE OR REPLACE FUNCTION</command> ne vous laissera pas
60    modifier le type en retour d'une fonction existante. Pour cela, vous devez
61    supprimer et recréer la fonction.
62   </para>
63
64   <para>
65    Si vous supprimez, puis recréez une fonction, la nouvelle fonction n'est pas
66    la même entité que l'ancienne&nbsp;; vous casserez les règles, vues,
67    déclencheurs, etc. qui référençaient l'ancienne fonction. Utilisez
68    <command>CREATE OR REPLACE FUNCTION</command> pour modifier la définition
69    d'une fonction sans casser d'objets qui se réfèrent à la fonction.
70   </para>
71
72   <para>
73    L'utilisateur qui crée la fonction devient le propriétaire de la fonction.
74   </para>
75  </refsect1>
76
77  <refsect1>
78   <title>Paramètres</title>
79
80    <variablelist>
81
82     <varlistentry>
83      <term><replaceable class="parameter">nom</replaceable></term>
84
85      <listitem>
86       <para>
87        Le nom d'une fonction à créer.
88       </para>
89      </listitem>
90     </varlistentry>
91
92     <varlistentry>
93      <term><replaceable class="parameter">typearg</replaceable></term>
94
95      <listitem>
96       <para>
97        Le type de données des arguments de la fonction (qualifié ou non du nom
98        du schéma), s'il y en a. Les types d'argument pourraient être de base,
99        complexe ou des domaines ou copier le type d'une colonne existante.
100       </para>
101       <para>
102        Le type d'une colonne est référencé en lançant
103        <literal><replaceable
104        class="parameter">nomtable</replaceable>.<replaceable
105        class="parameter">nomcolonne</replaceable>%TYPE</literal>&nbsp;;
106        utiliser ceci peut quelque fois vous aider à rendre la fonction
107        indépendante des modifications de la définition d'une table.
108       </para>
109       <para>
110        Suivant le langage d'implémentation, il pourrait aussi être autorisé de
111        spécifier des <quote>pseudotypes</> plutôt que des <type>cstring</>. Les
112        pseudotypes indiquent que le type d'argument réel est soit non
113        complètement spécifié, soit en dehors de l'ensemble des types de données
114        ordinaires SQL.
115       </para>
116      </listitem>
117     </varlistentry>
118
119     <varlistentry>
120      <term><replaceable class="parameter">typeret</replaceable></term>
121
122      <listitem>
123       <para>
124        Le type de données en retour (pouvant être qualifié du nom du schéma).
125        Le type de retour pourrait être un type de base, complexe ou un domaine,
126        ou pourrait être spécifié pour copier le type d'une colonne existante.
127        Voir la description sous <literal>typearg</literal> ci-dessus pour savoir
128        comment référencer le type d'une colonne existante.
129       </para>
130       <para>
131        Suivant le langage d'implémentation, il pourrait aussi être autorisé de
132        spécifier un <quote>pseudotype</> tel que <type>cstring</>. Le
133        modificateur <literal>SETOF</literal> indique que la fonction renverra un
134        ensemble d'éléments plutôt qu'un seul élément.
135       </para>
136      </listitem>
137     </varlistentry>
138
139     <varlistentry>
140      <term><replaceable class="parameter">nomlang</replaceable></term>
141
142      <listitem>
143       <para>
144        Le nom du langage dans laquelle la fonction est implémentée. Pourrait
145        être <literal>SQL</literal>, <literal>C</literal>,
146        <literal>internal</literal> ou le nom d'un langage de procédures défini
147        par l'utilisateur. (Voir aussi <xref linkend="app-createlang"
148        endterm="app-createlang-title">.) Pour une compatibilité ascendante, le
149        nom peut être englobé avec des guillemets simples.
150       </para>
151      </listitem>
152     </varlistentry>
153
154     <varlistentry>
155      <term><literal>IMMUTABLE</literal></term>
156      <term><literal>STABLE</literal></term>
157      <term><literal>VOLATILE</literal></term>
158
159      <listitem>
160       <para>
161        Ces attributs informent le système s'il est sain de remplacer plusieurs
162        évaluations de la fonction avec une seule évaluation pour une
163        optimisation en exécution. Au plus un choix devra être donné. Si aucun
164        n'apparaît, <literal>VOLATILE</literal> est la valeur par défaut.
165       </para>
166
167       <para>
168        <literal>IMMUTABLE</literal> indique que la fonction renvoie toujours le
169        même résultat si elle reçoit les mêmes valeurs en argument&nbsp;;
170        c'est-à-dire qu'elle n'effectue pas de recherches dans la base de données
171        ou, autrement, qu'elle utilise l'information non présente directement
172        dans la liste d'arguments. Si cette option est donnée, tout appel de la
173        fonction avec des arguments constants peut être immédiatement remplacé
174        par la valeur de la fonction.
175       </para>
176
177       <para>
178        <literal>STABLE</literal> indique qu'à l'intérieur d'un seul parcours de
179        la table, la fonction renverra le même résultat pour les mêmes valeurs
180        d'argument, mais son résultat pourrait varier au travers des
181        instructions SQL. Ceci est la sélection appropriée pour les fonctions
182        dont les résultats dépendent des recherches en base de données, des
183        variables paramètres (tel que la zone horaire en cours), etc. Notez aussi
184        que la famille de fonctions <function>current_timestamp</> est qualifiée
185        de stable car leur valeur ne change pas à l'intérieur d'une transaction.
186       </para>
187
188       <para>
189        <literal>VOLATILE</literal> indique que la valeur de la fonction peut
190        changer même avec un seul parcours de table, donc aucune optimisation ne
191        peut être réalisée. Relativement peu de fonctions de bases de données
192        sont volatiles dans ce sens&nbsp;; quelques exemples sont
193        <literal>random()</>, <literal>currval()</>, <literal>timeofday()</>.
194        Notez que toute fonction qui a des effets de bord doit être classée
195        comme volatile, même si son résultat est assez prévisible pour empêcher
196        l'optimisation des appels&nbsp;; un exemple est <literal>setval()</>.
197       </para>
198      </listitem>
199     </varlistentry>
200
201     <varlistentry>
202      <term><literal>CALLED ON NULL INPUT</literal></term>
203      <term><literal>RETURNS NULL ON NULL INPUT</literal></term>
204      <term><literal>STRICT</literal></term>
205
206      <listitem>
207       <para>
208        <literal>CALLED ON NULL INPUT</literal> (la valeur par défaut) indique
209        que la fonction sera appelée normalement quand certains de ses arguments
210        sont NULL. C'est alors de la responsabilité de l'auteur de la fonction de
211        vérifier les valeurs NULL si nécessaire et de répondre en conséquence.
212       </para>
213
214       <para>
215        <literal>RETURNS NULL ON NULL INPUT</literal> ou
216        <literal>STRICT</literal> indiquent que la fonction renvoie toujours
217        NULL si un de ces arguments est NULL. Si ce paramètre est spécifié, la
218        fonction n'est pas exécutée quand il y a des arguments NULL&nbsp;; à la
219        place, un résultat NULL est automatiquement renvoyé.
220       </para>
221      </listitem>
222     </varlistentry>
223
224    <varlistentry>
225     <term><literal><optional>EXTERNAL</optional> SECURITY INVOKER</literal></term>
226     <term><literal><optional>EXTERNAL</optional> SECURITY DEFINER</literal></term>
227
228     <listitem>
229      <para>
230       <literal>SECURITY INVOKER</literal> indique que la fonction doit être
231       exécutée avec les droits de l'utilisateur qui l'appelle. C'est la valeur
232       par défaut. <literal>SECURITY DEFINER</literal> spécifie que la fonction
233       doit être exécutée avec les droits de l'utilisateur qui l'a créé.
234      </para>
235
236      <para>
237       Le mot clé <literal>EXTERNAL</literal> est présent pour la conformité SQL
238       mais est optionnelle car, contrairement à SQL, cette fonctionnalité ne
239       s'applique qu'aux fonctions externes.
240      </para>
241     </listitem>
242    </varlistentry>
243
244     <varlistentry>
245      <term><replaceable class="parameter">definition</replaceable></term>
246
247      <listitem>
248       <para>
249        Une chaîne définissant la fonction&nbsp;; la signification dépend du
250        langage. Cela pourrait être un nom de fonction interne, le chemin vers un
251        fichier objet, une commande SQL ou un texte dans un langage de
252        procédures.
253       </para>
254      </listitem>
255     </varlistentry>
256
257     <varlistentry>
258      <term><literal><replaceable
259         class="parameter">fichier_obj</replaceable>, <replaceable
260         class="parameter">symbole_lien</replaceable></literal></term>
261
262      <listitem>
263       <para>
264        Cette forme de clause <literal>AS</literal> est utilisée pour les
265        fonctions en langage C chargeables dynamiquement quand le nom de la
266        fonction dans le code source C n'est pas le même que celui de la fonction
267        C. La chaîne <replaceable class="parameter">fichier_obj</replaceable> est
268        le nom du fichier contenant l'objet chargeable dynamiquement et
269        <replaceable class="parameter">symbole_lien</replaceable> est le symbole
270        de lien de la fonction, c'est-à-dire le nom de la fonction dans le code
271        source C. Si ce lien est omis, il est supposé être le même que le nom de
272        la fonction en cours de définition.
273       </para>
274      </listitem>
275     </varlistentry>
276
277     <varlistentry>
278      <term><replaceable class="parameter">attribut</replaceable></term>
279
280      <listitem>
281       <para>
282        La façon historique de spécifier les morceaux optionnels d'informations
283        sur la fonction. Les attributs suivants pourraient apparaître ici&nbsp;:
284
285       <variablelist>
286        <varlistentry>
287         <term><literal>isStrict</></term>
288         <listitem>
289          <para>
290           Équivalent à <literal>STRICT</literal> ou <literal>RETURNS NULL ON
291           NULL INPUT</literal>
292          </para>
293         </listitem>
294        </varlistentry>
295
296        <varlistentry>
297         <term><literal>isCachable</></term>
298         <listitem>
299          <para>
300           <literal>isCachable</literal> est un équivalent obsolète de
301           <literal>IMMUTABLE</literal>&nbsp;; il est toujours accepté pour des
302           raisons de compatibilité ascendante.
303          </para>
304         </listitem>
305        </varlistentry>
306
307       </variablelist>
308
309       Les noms d'attribut ne sont pas sensibles à la casse.
310      </para>
311     </listitem>
312    </varlistentry>
313
314    </variablelist>
315
316  </refsect1>
317
318  <refsect1 id="sql-createfunction-notes">
319   <title>Notes</title>
320
321    <para>
322     Référez-vous à <xref linkend="xfunc"> pour plus d'informations sur
323     l'écriture de fonctions.
324    </para>
325
326    <para>
327     La syntaxe complète de type <acronym>SQL</acronym> est autorisée pour les
328     arguments en entrée et pour la valeur de sortie. Néanmoins, quelques détails
329     de spécification de type (c'est-à-dire le champ précision pour le type
330     <type>numeric</type>) sont de la responsabilité de l'implémentation de la
331     fonction sous-jacente et sont silencieusement avalés (c'est-à-dire non
332     reconnus ou forcés) par la commande <command>CREATE FUNCTION</command>.
333    </para>
334
335    <para>
336     <productname>PostgreSQL</productname> autorise le
337     <firstterm>surchargement</firstterm> de fonctions&nbsp;; c'est-à-dire que
338     le même nom peut être utilisé pour plusieurs fonctions différentes si tant
339     est qu'elles ont des types d'arguments distincts. Néanmoins, les noms C de
340     toutes les fonctions doivent être différents, donc vous devez donner des
341     noms différentes aux fonctions C suchargées (par exemple, utilisez les
342     types d'argument comme morceaux des noms des fonctions C).
343    </para>
344
345    <para>
346     Lors d'appels répétés à <command>CREATE FUNCTION</command> et se référant
347     au même fichier objet, le fichier est chargé une seule fois. Pour décharger
348     et recharger le fichier (peut-être pendant le développement), utilisez la
349     commande <xref linkend="sql-load" endterm="sql-load-title">.
350    </para>
351
352    <para>
353     Utilisez <command>DROP FUNCTION</command> pour supprimer les fonctions
354     définies par l'utilisateur.
355    </para>
356
357   <para>
358    Tout guillemet simple ou antislash dans la définition de la fonction doit
359    être échappé en le doublant.
360   </para>
361
362    <para>
363     Pour être capable de définir une fonction, l'utilisateur doit avoir le droit
364     <literal>USAGE</literal> sur le langage.
365    </para>
366
367  </refsect1>
368
369  <refsect1 id="sql-createfunction-examples">
370   <title>Exemples</title>
371
372   <para>
373    Voici un exemple trivial pour vous aider à commencer. Pour plus
374    d'informations et d'exemples, voir <xref linkend="xfunc">.
375 <programlisting>
376 CREATE FUNCTION add(integer, integer) RETURNS integer
377     AS 'select $1 + $2;'
378     LANGUAGE SQL
379     IMMUTABLE
380     RETURNS NULL ON NULL INPUT;
381 </programlisting>
382   </para>
383  </refsect1>
384
385  <refsect1 id="sql-createfunction-security">
386   <title>Écrire des fonctions <literal>SECURITY DEFINER</literal> en toute
387     sécurité</title>
388
389    <para>
390     Comme une fonction <literal>SECURITY DEFINER</literal> est exécutée
391     avec les droits de l'utilisateur qui l'a créé, une certaine attention
392     est nécessaire pour s'assurer que la fonction ne peut pas être
393     utilisée de façon maline. Pour des raisons de sécurité,
394     <xref linkend="guc-search-path"> doit être configuré pour exclure tout
395     schéma où des utilisateurs qui ne sont pas de confiance pourraient
396     écrire. Ceci empêche des utilisateurs malveillants de créer des
397     objets qui masqueraient des objets utilisés par la fonction. Dans
398     cette idée, le schéma des tables temporaires est particulièrement
399     important car il est le premier schéma dans lequel a lieu la recherche
400     et il est modifiable par tout utilisateur. Une solution est de forcer
401     la recherche à ne prendre en condition ce schéma qu'en dernier lieu.
402     Pour cela, écrire <literal>pg_temp</> en tant que dernière entrée de
403     <varname>search_path</>. La fonction suivante illustre une utilisation
404     sûre&nbsp;:
405    </para>
406
407 <programlisting>
408 CREATE FUNCTION verifie_motdepasse(unom TEXT, motpasse TEXT)
409 RETURNS BOOLEAN AS $$
410 DECLARE ok BOOLEAN;
411         ancien_path TEXT;
412 BEGIN
413         -- Sauvegarder l'ancien search_path ;
414         -- remarquez que nous devons qualifier current_setting
415         -- pour nous assurer que nous appelons la bonne fonction
416         ancien_path := pg_catalog.current_setting('search_path');
417
418         -- Configurer un search_path sécurisé : schémas de confiance, puis 'pg_temp'.
419         -- Nous initialisons is_local = true pour que l'ancienne valeur
420         -- soit restaurée au cas où une erreur survienne avant que nous
421         -- n'atteignons la fin de la fonction.
422         PERFORM pg_catalog.set_config('search_path', 'admin, pg_temp', true);
423
424         -- Effectuer le travail sécurisé de la fonction.
425         SELECT  (motdepasse = $2) INTO ok
426         FROM    motsdepasse
427         WHERE   nomutilisateur = $1;
428
429         -- Restaurer le search_path de l'appelant
430         PERFORM pg_catalog.set_config('search_path', ancien_path, true);
431
432         RETURN ok;
433 END;
434 $$ LANGUAGE plpgsql SECURITY DEFINER;
435 </programlisting>
436
437  </refsect1>
438
439  <refsect1 id="sql-createfunction-compat">
440   <title>Compatibilité</title>
441
442   <para>
443    Une commande <command>CREATE FUNCTION</command> est définie en SQL99.
444    La version <productname>PostgreSQL</productname> est similaire mais pas
445    entièrement compatible. Les attributs ne sont pas portables, pas plus que
446    les différents langages disponibles.
447   </para>
448  </refsect1>
449
450
451  <refsect1 id="sql-createfunction-seealso">
452   <title>Voir aussi</title>
453
454   <para>
455    <xref linkend="sql-alterfunction" endterm="sql-alterfunction-title">,
456    <xref linkend="sql-dropfunction" endterm="sql-dropfunction-title">,
457    <xref linkend="sql-grant" endterm="sql-grant-title">,
458    <xref linkend="sql-load" endterm="sql-load-title">,
459    <xref linkend="sql-revoke" endterm="sql-revoke-title">,
460    <xref linkend="app-createlang">
461   </para>
462  </refsect1>
463
464 </refentry>
465
466 <!-- Keep this comment at the end of the file
467 Local variables:
468 mode:sgml
469 sgml-omittag:nil
470 sgml-shorttag:t
471 sgml-minimize-attributes:nil
472 sgml-always-quote-attributes:t
473 sgml-indent-step:1
474 sgml-indent-data:t
475 sgml-parent-document:nil
476 sgml-default-dtd-file:"../reference.ced"
477 sgml-exposed-tags:nil
478 sgml-local-catalogs:("/usr/lib/sgml/catalog")
479 sgml-local-ecat-files:nil
480 End:
481 -->
Note: See TracBrowser for help on using the browser.