| 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 ; 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> ; |
|---|
| 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 ; |
|---|
| 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 ; 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 ; 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 ; à 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 ; 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 : |
|---|
| 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> ; 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 ; 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 : |
|---|
| 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 |
--> |
|---|