Chapitre 34. Syst�me de r�gles

Table des mati�res
34.1. Arbre de requ�tes
34.2. Vues et syst�me de r�gles
34.2.1. Fonctionnement des r�gles SELECT
34.2.2. R�gles de vue dans des instructions autres que SELECT
34.2.3. Puissance des vues dans PostgreSQL
34.2.4. Mise � jour d'une vue
34.3. R�gles sur INSERT, UPDATE et DELETE
34.3.1. Fonctionnement des r�gles de mise � jour
34.3.2. Coop�ration avec les vues
34.4. R�gles et droits
34.5. R�gles et statut de commande
34.6. R�gles contre d�clencheurs

Ce chapitre discute du syst�me de r�gles dans PostgreSQL. Les syst�mes de r�gles de production sont simples conceptuellement mais il existe de nombreux points subtils impliqu�s dans leur utilisation.

Certains autres syst�mes de bases de donn�es d�finissent des r�gles actives pour la base de donn�es, conserv�es habituellement en tant que proc�dures stock�es et d�clencheurs. Avec PostgreSQL, elles peuvent aussi �tre impl�ment�es en utilisant des fonctions et des d�clencheurs.

Le syst�me de r�gles (plus pr�cis�ment, le syst�me de r�gles de r��criture de requ�tes) est totalement diff�rent des proc�dures stock�es et des d�clencheurs. Il modifie les requ�tes pour prendre en consid�ration les r�gles puis passe la requ�te modifi�e au planificateur de requ�tes pour planification et ex�cution. Il est tr�s puissant et peut �tre utilis� pour beaucoup de choses comme des proc�dures en langage de requ�tes, des vues et des versions. Les fondations th�oriques et la puissance de ce syst�me de r�gles sont aussi discut�es dans On Rules, Procedures, Caching and Views in Database Systems et A Unified Framework for Version Modeling Using Production Rules in a Database System.

34.1. Arbre de requ�tes

Pour comprendre comment fonctionne le syst�me de r�gles, il est n�cessaire de comprendre quand il est appel� et quelles sont ses entr�es et sorties.

Le syst�me de r�gles est situ� entre l'analyseur et le planificateur. Il prend la sortie de l'analyseur, un arbre de requ�te et les r�gles de r��criture d�finies par l'utilisateur qui sont aussi des arbres de requ�tes avec quelques informations suppl�mentaires, et cr�e z�ro ou plusieurs arbres de requ�tes comme r�sultat. Donc, son entr�e et sortie sont toujours des �l�ments que l'analyseur lui-m�me pourrait avoir produit et, du coup, tout ce qu'il voit est repr�sentable basiquement comme une instruction SQL.

Maintenant, qu'est-ce qu'un arbre de requ�tes ? C'est une repr�sentation interne d'une instruction SQL o� les parties qui le forment sont stock�es s�par�ment. Ces arbres de requ�tes sont affichables dans le journal de traces du serveur si vous avez configur� les param�tres debug_print_parse, debug_print_rewritten, ou debug_print_plan. Les actions de r�gles sont aussi enregistr�es comme arbres de requ�tes dans le catalogue syst�me pg_rewrite. Elles ne sont pas format�es comme la sortie de traces mais elles contiennent exactement la m�me information.

Lire un arbre de requ�te brut requiert un peu d'exp�rience. Mais comme les repr�sentations SQL des arbres de requ�tes sont suffisantes pour comprendre le syst�me de r�gles, ce chapitre ne vous apprendra pas � les lire.

Lors de la lecture des repr�sentations SQL des arbres de requ�tes dans ce chapitre, il est n�cessaire d'�tre capable d'identifier les morceaux cass�s de l'instruction lorsqu'ils sont dans la structure de l'arbre de requ�te. Les parties d'un arbre de requ�tes sont

le type de commande

C'est une simple valeur indiquant quelle commande (SELECT, INSERT, UPDATE, DELETE) l'arbre de requ�tes produira.

la table d'�chelle

La table d'�chelle est une liste des relations utilis�es dans la requ�te. Dans une instruction SELECT, ce sont les relations donn�es apr�s le mot cl� FROM.

Chaque entr�e de la table d'�chelle identifie une table ou une vue et indique par quel nom elle est d�sign�e dans les autres parties de la requ�te. Dans l'arbre de requ�tes, les entr�es de la table d'�chelle sont r�f�renc�es par des num�ros plut�t que par des noms, donc il importe peu, ici, de savoir s'il y a des noms dupliqu�s comme cela serait le cas avec une instruction SQL. Ceci peut arriver apr�s que les tables d'�chelle des r�gles aient �t� assembl�es. Les exemples dans ce chapitre n'auront pas cette situation.

la relation r�sultat

C'est un index dans la table d'�chelle qui identifie la relation o� iront les r�sultats de la requ�te.

Les requ�tes SELECT n'ont normalement pas de relation r�sultat. Le cas sp�cial d'un SELECT INTO est pratiquement identique � un CREATE TABLE suivi par un INSERT ... SELECT et n'est pas discut� s�par�ment ici.

Pour les commandes INSERT, UPDATE et DELETE, la relation de r�sultat est la table (ou vue !) o� les changements prennent effet.

la liste cible

La liste cible est une liste d'expressions d�finissant le r�sultat d'une requ�te. Dans le cas d'un SELECT, ces expressions sont celles qui construisent la sortie finale de la requ�te. Ils correspondent aux expressions entre les mots cl�s SELECT et FROM (* est seulement une abr�viation pour tous les noms de colonnes d'une relation. Il est �tendu par l'analyseur en colonnes individuelles, pour que le syst�me de r�gles ne le voit jamais).

Les commandes DELETE n'ont pas besoin d'une liste de colonnes car elles ne produisent aucun r�sultat. En fait, le planificateur ajoutera une entr�e sp�ciale CTID pour aller jusqu'� la liste de cibles mais c'est apr�s le syst�me de r�gles ; pour le syst�me de r�gles, ce sera discut� apr�s ; pour le syst�me de r�gles, la liste de cibles est vide.

Pour les commandes INSERT, la liste cible d�crit les nouvelles lignes devant aller dans la relation r�sultat. Elle consiste en des expressions de la clause VALUES ou en celles de la clause SELECT dans INSERT ... SELECT. La premi�re �tape du processus de r��criture ajoute les entr�es de la liste cible pour les colonnes n'ont affect�es par la commande originale mais ayant des valeurs par d�faut. Toute colonne restante (avec soit une valeur donn�e soit une valeur par d�faut) sera remplie par le planificateur avec une expression NULL constante.

Pour les commandes UPDATE, la liste cible d�crit les nouvelles lignes rempla�ant les anciennes. Dans le syst�me des r�gles, elle contient seulement les expressions de la partie SET colonne = expression de la commande. Le planificateur g�rera les colonnes manquantes en ins�rant des expressions qui copient les valeurs provenant de l'ancienne ligne dans la nouvelle. et elle ajoutera l'ancienne entr�e CTID dans la nouvelle ligne comme pour le DELETE.

Chaque entr�e de la liste cible contient une expression qui peut �tre une valeur constante, une variable pointant vers une colonne d'une des relations de la table d'�chelle, un param�tre ou un arbre d'expressions r�alis� � partir d'appels de fonctions, de constantes, de variables, d'op�rators, etc.

la qualification

La qualification de la requ�te est une expression ressemblant � une de celles contenues dans les entr�es de la liste cible. La valeur r�sultant de cette expression est un bool�en indiquant si l'op�ration (INSERT, UPDATE, DELETE ou SELECT) pour la ligne de r�sultat final devrait �tre ex�cut�e ou non. Elle correspond � la clause WHERE d'une instruction SQL.

l'arbre de jointure

L'arbre de jointure de la requ�te affiche la structure de la clause FROM. Pour une simple requ�te comme SELECT ... FROM a, b, c, l'arbre de jointure est une simple liste d'�l�ments de FROM parce que nous sommes autoris�s � les joindre dans tout ordre. Mais quand des expressions JOIN, et plus particuli�rement les jointures externes, sont utilis�es, nous devons les joindre dans l'ordre affich� par les jointures. Dans ce cas, l'arbre de jointure affiche la structure des expressions JOIN. Les restrictions associ�es avec ces clauses JOIN particuli�res (� partir d'expressions ON ou USING) sont enregistr�es comme des expressions de qualification attach�es aux nœuds de l'arbre de jointure. Il s'av�re agr�able d'enregistrer l'expression de haut niveau WHERE comme une qualification attach�e � l'�l�ment de l'arbre de jointure de haut niveau. Donc, r�ellement, l'arbre de jointure repr�sente � la fois les clauses FROM et WHERE d'un SELECT.

le reste

Les autres parties de l'arbre de requ�te comme la clause ORDER BY n'ont pas d'int�r�t ici. Le syst�me de r�gles substitue quelques entr�es lors de l'application des r�gles mais ceci n'a pas grand chose � voir avec les fondamentaux du syst�me de r�gles.