Académique Documents
Professionnel Documents
Culture Documents
RESUME THEORIQUE
&
GUIDE DES TRAVAUX PRATIQUES
SECTEUR : NTIC
SPECIALITE : TSDI
Version 1.0
Résumé de Théorie et guide de
M 12 : Programmation des procédures stockées et des triggers
travaux pratiques
Révision linguistique
Validation
Sommaire
I. INTODUCTION............................................................................................................................................7
II. TYPES DE DONNÉES.................................................................................................................................8
II.1.VALEURS NUMÉRIQUES EXACTES...................................................................................................................8
II.2.DECIMAL ET NUMERIC....................................................................................................................................9
II.3.TYPES DE DONNÉES MONÉTAIRES REPRÉSENTANT DES VALEURS MONÉTAIRES OU DES DEVISES.................9
II.4.DONNÉES NUMÉRIQUES APPROCHÉES............................................................................................................9
II.6.CHAÎNES DE CARACTÈRES............................................................................................................................11
II.7.CHAÎNES DE CARACTÈRES UNICODE............................................................................................................12
II.8.CHAÎNES BINAIRES.......................................................................................................................................13
II.9.AUTRES TYPES DE DONNÉES........................................................................................................................13
III. DÉCLARATION DES VARIABLES LOCALES....................................................................................18
IV. AFFICHAGE DES VALEURS..................................................................................................................18
V. BLOC D’INSTRUCTIONS........................................................................................................................19
VI. STRUCTURE ALTERNATIVE................................................................................................................20
VII. STRUCTURE ITÉRATIVE.......................................................................................................................21
VIII. STRUCTURE DE CHOIX (CASE)...........................................................................................................22
IX. LOTS D'INSTRUCTIONS.........................................................................................................................23
X. TRAITEMENT DES TRANSACTIONS..................................................................................................24
XI. GESTION DES VERROUS........................................................................................................................26
XII. MESSAGES D'ERREUR...........................................................................................................................27
XIII. PROCÉDURES STOCKÉES.....................................................................................................................31
SYNTAXE.............................................................................................................................................................31
ARGUMENTS.......................................................................................................................................................31
AUTORISATIONS..................................................................................................................................................38
EXEMPLE.............................................................................................................................................................38
EXERCICES..........................................................................................................................................................46
XIV. DÉCLENCHEURS (TRIGGERS)............................................................................................................47
EXERCICES..........................................................................................................................................................54
XV. CURSEURS(CURSOR)..............................................................................................................................55
SYNTAXE.............................................................................................................................................................55
AUTORISATIONS..................................................................................................................................................55
EXEMPLE.............................................................................................................................................................55
AUTORISATIONS..................................................................................................................................................57
I. TP1................................................................................................................................................................60
II. TP2................................................................................................................................................................61
III. TP 3...............................................................................................................................................................62
IV. TP 4...............................................................................................................................................................64
COMPORTEMENT ATTENDU
CONDITIONS D’EVALUATION
Epreuve écrite de programmation
Travail individuel effectué sur PC sous Windows avec SQL Server
RESUME THEORIQUE
I. Intoduction
SQL Server 2000 répond aux besoins émanant des grandes entreprises mondiales. Grâce aux
fonctionnalités de partitionnement et d'indexation de Transact-SQL, les développeurs créent de
véritables applications de bases de données distribuées et évolutives.
Transact-SQL est une extension de SQL vers un langage de promgrammation, il est aussi le point
central de l'utilisation de Microsoft SQL Server. Toutes les applications qui communiquent avec SQL
Server le font en envoyant des instructions Transact-SQL au serveur, quelle que soit l'interface
utilisateur de l'application.
Historique
Le langage SQL est né à la suite des travaux du mathématicien CODD.Historiquement, les années
suivantes sont importantes :
-1986 :Normalisation de SQL-86
-1989 :Normalisation de SQL-89
Déclaration multiple
Affectation
Syntaxe générale :
Exemple
select @i=3
set @j=4
select @str='TSDI'
affectation multiple
select @i=3,@j=4,@str='TSDI' est correcte, mais par contre set @i=3,@j=4,@str='TSDI' est une
affectation incorrecte.
Select @i
Affichage multiple
Select @i,@j,@str
NB:On peut utiliser select pour affecter une valeur ou bien pour afficher une autre, mais pas pour
faire les deux, donc l’instruction select @i=20, @str est incorrecte.
Declare @stg table(numInsc int primary key, nom varchar(20), prenom varchar(20),moyenne numeric(4,2))
/*la particularité des variables de type table, est qu’on peut utiliser des commandes insert,
select,update, delete */
NB : les variables de type table sont différentes des tables temporairement qui sont créer
physiquement dans la base de données tempDB comme des objetspar contre les premeires sont
stockées dans la RAM (mémoire volatile).
Ainsi, si vous créez une table nommée employees, elle est accessible à toute personne possédant les
autorisations de sécurité sur la base de données pour l'utiliser, et ce jusqu'à sa suppression. Si vous
créez une table temporaire locale nommée #employees, vous êtes le seul à pouvoir y travailler, et elle
est supprimée dès que vous vous déconnectez. En revanche, une table temporaire globale du nom de
##employees peut être manipulée par tout utilisateur de la base de données. Si aucun autre utilisateur
ne se sert de la table après que vous l'avez créée, elle est supprimée au moment où vous vous
déconnectez. Si un autre utilisateur l'utilise, SQL Server la supprime dès que celui-ci et vous-même
vous déconnectez.
Les variables globales sont affectées directement par le serveur, elle retournent une seul valeur,elle
sont utilisées pour communiquer une information au client, elle sont notées @@nom_variable
Exemple :
Un bloc d’instruction est une ensemble d’instruction T-SQL qui sont considéré comme un tout ( une
seule).
Begin
--instruction(1)
--instruction(2)
--instruction(N)
end
example:
begin
set @i=2
set @j=3
select @i=@i+1
set @j=@j-1
end
V. Structure alternative
La structure alternative est une structure de contrôle qui permet d’exécuter un de deux actions
suivant une condition.
Syntaxe
If(condition)
else
NB :
Exemple :
Declare @stg table(numInsc int primary key, nom varchar(20), prenom varchar(20),moyenne numeric(4,2))
Else
Syntaxe générale :
While(condition)
où
etiquette
goto etiquette
set @n=6
set @f=1
set @i=1
while (@i<=@n)
begin
set @f=@f*@i
set @i=@i+1
end
deuxieme solution :
set @n=6
set @f=1
set @i=1
label:
set @f=@f*@i
set @i=@i+1
les clauses WHEN spécifiant les expressions à rechercher et les clauses THEN spécifiant les
expressions par lesquelles les remplacer,
Cet exemple affiche dans le jeu de résultats d'une requête, le nom complet de la ville dans laquelle vit
chaque Fomateur :
SELECT nomFormateur, ville,
CASE state
WHEN 'CA' THEN 'Casblanca'
WHEN 'Kn' THEN 'Kenitra'
WHEN 'RB' THEN 'Rabat'
END AS 'ville d''affectation’
FROM Formateur
ORDER BY nomFormateur
Une erreur de compilation, comme une erreur de syntaxe, empêche la compilation du plan d'exécution,
si bien qu'aucune instruction du lot n'est exécutée.
Une erreur au moment de l'exécution, tel qu'un débordement arithmétique ou une violation de
contrainte, a l'un des deux effets suivants :
La plupart des erreurs d'exécution interrompent l'instruction en cours ainsi que celles qui la suivent
dans le lot.
Quelques erreurs d'exécution, telles que les violations de contraintes, n'interrompent que l'instruction
en cours. Toutes les instructions restantes dans le lot sont exécutées.
Les instructions exécutées avant celle qui a subit l'erreur d'exécution ne sont pas affectées. La seule
exception s'applique lorsque le lot est dans une transaction et que l'erreur provoque son annulation
(rollback). Dans ce cas, toutes les modifications de données non validées avant la condition d'erreur
sont annulées.
Supposons qu'un lot comporte 10 instructions. Si la cinquième instruction comporte une erreur de
syntaxe, aucune instruction ne sera exécutée. Si le lot est compilé et que la seconde instruction échoue
pendant son exécution, les résultats de la première instruction ne sont pas affectés car elle a déjà été
exécutée.
Les instructions CREATE PROCEDURE, CREATE RULE, et CREATE VIEW ne peuvent pas être
combinées à d'autres instructions du lot. L'instruction CREATE doit démarrer le lot. Tous les autres
instructions qui suivent dans ce lot seront interprétées comme une partie de la définition de la première
instruction CREATE.
Dans le même lot, vous ne pouvez pas modifier une table puis faire référence aux nouvelles colonnes.
Si une instruction EXECUTE(voir plus loin) est la première instruction d'un lot, le mot clé
EXECUTE n'est pas nécessaire. Le mot clé EXECUTE n'est nécessaire que si l'instruction
EXECUTE n'est pas la première instruction du lot.
Les transactions peuvent être utilisées dans le langage graphique ainsi que dans Transac-SQL
(Procédure stockée) :
Dans TSQL, il n'y aura pas d'aller-retour vers le client, la transaction sera donc
terminée plus rapidement.
Syntaxes
Début de transaction
Validation de transaction
Annulation de transaction
If @@rowcount = 0
BEGIN
ROLLBACK TRANSACTION
RAISERROR ('Id Project incorrect ', 16, 1)
RETURN
END
UPDATE Assignment
SET ReleaseDate = getdate()
WHERE ProjectID = @pid
AND ReleaseDate is NULL
COMMIT TRANSACTION
Transactions imbriquées
… … …
Begin Tran Begin Tran
Begin Tran … …
… CALL C If not ok
CALL B If not ok Rollback
If not ok Rollback Tran Tran
Else Else
Rollback
Commit Tran Commit Tran
Tran
Else
Tran
Une transaction ne pourra pas modifier des pages accessibles par une autre
transaction, et ne pourra lire des pages en cours de modifications (lecture cohérente).
Les opérations Select ont besoin d'un verrou partagé (share lock)
Insert, update et delete nécessitent des verrous exclusifs
Choix du niveau
C'est choix sont fait au niveau général est appartiennent au responsable de la base de
données, le développeur indique ce qu'il fait dans ses applications.
variable système @@ERROR. Ainsi une requête provoquant une erreur charge la variable
@@ERROR avec le
Msg 208, Niveau 16, État 1, Ligne 1 Nom d'objet 'TABLEINEXISTANTE' non valide.
SELECT @@ERROR
De ce fait, dans les scripts TSQL ou dans les procédures stockées, nous devions faire un test de
validation avec
cette variable système pour valider une transaction par un COMMIT ou l'annuler avec un
ROLLBACK.
BEGIN TRAN
IF (@@ERROR = 0)
BEGIN
COMMIT
END
ELSE
BEGIN
ROLLBACK
END
Cette gestion pouvait être très lourde, car la variable @@ERROR ne conserve qu'un code d'erreur, et
dans
Dans ces situations, la commande GOTO pouvait nous aider en demandant au moteur d'aller à un
point donné
du script TSQL, cela permet de faire une gestion globale de ces erreurs.
BEGIN TRAN
IF (@@ERROR = 0)
BEGIN
COMMIT
GOTO AFFICHAGEOK
END
ELSE
BEGIN
ROLLBACK
GOTO AFFICHAGEERREUR
END
AFFICHAGEERREUR:
SELECT @@ERROR
AFFICHAGEOK:
Malgré tout, on sent bien que cette gestion devient vite complexe à gérer et à suivre. De plus,
certaines erreurs
ne sont pas captées par la variable, comme le cas des objets inexistants qui bloque directement le
script.
Sous le langage TSQL de SQL Server 2005, ceci a été revu et une nouvelle gestion est apparue qui
rapproche le
Il existe de nombreux messages d'erreurs prédéfinis, qu'il est possible de lever avec l'instruction
RAISERROR. Il est toutefois possible de définir ses propres messages d'erreur par l'intermédiaire de
sp_addmessage.
langue: permet de connaitre la langue relative au message. L'adaptation est faite de façon automatique
en fonction des paramètres de langues de la connexion.
Autres termes utilisés : procédure cataloguée / procédure mémorisée, Remote procedure en anglais.
Particularités :
Leur syntaxe est vérifiée et elles sont compilées. C’est le code compilé qui est utilisé
lors des appels
Ne sont pas appelées automatiquement, mais doivent faire l’objet d’un appel explicite
de la part de l’utilisateur.
Avantages :
Syntaxe
Arguments
procedure_name
Nom de la nouvelle procédure stockée. Les noms des procédures doivent respecter les règles
applicables aux identificateurs et doivent être uniques dans la base de données et pour son
propriétaire.
Les procédures temporaires locales ou globales peuvent être créées en faisant précéder le
procedure_name, par un signe dièse unique (#procedure_name) pour les procédures temporaires
locales, et par deux signes dièse (##procedure_name) pour les procédures temporaires globales. Le
nom complet, y compris les signes # ou ##, ne peut dépasser 128 caractères. Facultativement, vous
pouvez spécifier le nom du propriétaire de la procédure.
;number
Nombre entier facultatif utilisé pour regrouper les procédures de même nom afin qu'elles puissent
être supprimées ensemble à l'aide d'une seule instruction DROP PROCEDURE. Par exemple, les
procédures utilisées avec une application appelée order peuvent être nommées orderproc;1,
orderproc;2, etc. L'instruction DROP PROCEDURE orderproc abandonne le groupe tout entier. Si le
nom contient des identificateurs délimités, le numéro ne doit pas être compris dans l'identificateur,
utilisez le délimiteur adéquat autour de procedure_name uniquement.
@parameter
Spécifiez un nom de paramètre en plaçant le signe @ comme premier caractère. Ce nom doit
respecter les règles gouvernant les identificateurs. Un paramètre est local à une procédure, vous
pouvez donc utiliser le même nom dans d'autres procédures. Par défaut, les paramètres ne peuvent
que prendre la place de constantes ; ils ne peuvent pas être utilisés à la place de noms de tables, de
colonnes ou d'autres objets base de données. data_type
Type de données du paramètre. Tous les types de données y compris les types text, ntext et image,
peuvent être utilisés comme paramètre dans une procédure stockée. Toutefois, le type de données
cursor ne peut être utilisé que dans des paramètres OUTPUT. Lorsque vous spécifiez un type de
données cursor, vous devez également spécifier les mots clés VARYING et OUTPUT.
Remarque Le nombre maximal de paramètres de sortie de type de données cursor n'est pas limité.
VARYING
Spécifie le jeu de résultats pris en charge comme paramètre de sortie (construit dynamiquement par
la procédure stockée et dont le contenu peut varier). S'applique uniquement aux paramètres de type
cursor.
default
Valeur par défaut pour le paramètre. Si vous avez défini une valeur par défaut, la procédure peut être
exécutée sans spécifier de valeur pour ce paramètre. La valeur par défaut doit être une constante ou
elle peut avoir la valeur NULL. La valeur par défaut peut contenir des caractères génériques (%, _,
[ ] et [^]) si la procédure utilise le nom du paramètre avec le mot clé LIKE.
OUTPUT
Indique que le paramètre est un paramètre de retour renvoyé par la procédure. La valeur de cette
option peut être renvoyée à EXEC[UTE]. Utilisez les paramètres OUTPUT pour renvoyer
l'information à la procédure appelante. Les paramètres de type Text, ntext et image peuvent être
utilisés comme paramètres OUTPUT. Un paramètre de sortie qui utilise le mot clé OUTPUT peut
être un espace réservé de curseur.
Emplacement réservé signalant qu'un nombre maximal de 2100 paramètres peut être spécifié.
RECOMPILE indique que SQL Server n'utilise pas le cache pour le plan de cette procédure et que la
procédure est recompilée à l'exécution. Utilisez l'option RECOMPILE lorsque vous utilisez des
valeurs temporaires ou atypiques sans remplacer le plan d'exécution placé en mémoire cache.
ENCRYPTION indique que SQL Server crypte l'entrée de la table syscomments contenant le texte
de l'instruction CREATE PROCEDURE. L'utilisation de l'argument ENCRYPTION évite la
publication de la procédure dans le cadre de la réplication SQL Server.
Remarque Pendant une mise à niveau, SQL Server utilise les commentaires cryptés qui sont
stockés dans syscomments pour recréer les procédures cryptées.
FOR REPLICATION
Indique que les procédures stockées créées pour la réplication ne peuvent pas être exécutées sur
l'abonné. Une procédure stockée créée avec l'option FOR REPLICATION est utilisée comme filtre
de procédure stockée et n'est exécutée que pendant la réplication. Cette option ne peut pas être
utilisée avec l'option WITH RECOMPILE.
AS
sql_statement
Tout numéro et type d'instructions Transact-SQL à inclure dans la procédure. Certaines limitations
s'appliquent.
Espace réservé qui indique que plusieurs instructions Transact-SQL peuvent être incluses dans cette
procédure.
NB :
Vous ne pouvez créer une procédure stockée définie par l'utilisateur que dans la base de données
courante (excepté pour les procédures temporaires qui sont toujours créées dans tempdb).
L'instruction CREATE PROCEDURE ne peut pas s'utiliser conjointement avec d'autres instructions
Transact-SQL dans un même lot d'instructions.
Par défaut, les paramètres peuvent accepter les valeurs NULL. Dans le cas où une valeur de
paramètre NULL est passée, et que ce paramètre est utilisé dans une instruction CREATE ou
ALTER TABLE dans laquelle la colonne référencée n'accepte pas les valeurs NULL, SQL Server
génère une erreur. Pour éviter de passer une valeur de paramètre NULL à une colonne qui n'accepte
pas les valeurs NULL, ajoutez une logique programmée à la procédure ou utilisez une valeur par
défaut pour la colonne (en utilisant le mot clé DEFAULT avec CREATE ou ALTER TABLE).
Il est recommandé de spécifier explicitement NULL ou NOT NULL pour chaque colonne dans toute
instruction CREATE TABLE ou ALTER TABLE d'une procédure stockée, comme par exemple lors
de la création d'une table temporaire. Les options ANSI_DFLT_ON et ANSI_DFLT_OFF
définissent la manière dont SQL Server assigne les attributs NULL ou NOT NULL aux colonnes,
s'ils ne sont pas spécifiés dans une instruction CREATE TABLE ou ALTER TABLE. Si une
connexion exécute une procédure stockée avec des valeurs différentes pour ces options que pour la
connexion qui a créé la procédure, les colonnes de la table créée par la seconde connexion peuvent
avoir des possibilités différentes de valeurs Null et présenter des comportements différents. Si
NULL ou NOT NULL est explicitement établi pour chaque colonne, les tables temporaires sont
créées avec la même possibilité de valeurs Null pour toutes les connexions qui exécutent la
procédure stockée.
D'autres options SET, telles que SET ARITHABORT, SET ANSI_WARNINGS ou SET
ANSI_PADDINGS ne sont pas sauvegardées lorsqu'une procédure stockée est créée ou modifiée. Si
la logique de la procédure stockée dépend d'un paramétrage particulier, incluez une instruction SET
au lancement de la procédure pour être certain de la bonne configuration. Lorsqu'une instruction
SET est exécutée à partir d'une procédure stockée, les paramètres ne restent effectifs que jusqu'à la
fin de l'exécution de la procédure stockée. Les paramètres reprennent ensuite la valeur qu'ils avaient
avant l'appel de la procédure stockée. Ceci permet aux clients individuels de définir les options
souhaitées sans affecter la logique de la procédure stockée.
La façon dont SQL Server interprète une chaîne vide, comme un espace unique ou comme une vraie
chaîne vide, dépend de la valeur du niveau de compatibilité. Si le niveau de compatibilité est
inférieur ou égal à 65, SQL Server interprète les chaînes vides comme des espaces simples. Si le
niveau de compatibilité est égal à 70, SQL Server interprète les chaînes vides comme telles.
Informations sur les procédures stockées
Pour afficher le texte utilisé pour créer la procédure, exécutez sp_helptext dans la base de données
dans laquelle la procédure se trouve en passant le nom de la procédure en paramètre.
Remarque : Les procédures stockées créées avec l'option ENCRYPTION ne peuvent être affichées
à l'aide de sp_helptext.
Pour obtenir une liste des objets référencés par une procédure, utilisez sp_depends.
Lorsque l'exécution d'une instruction CREATE PROCEDURE réussit, le nom de la procédure est
stocké dans la table système sysobjects et le texte de l'instruction CREATE PROCEDURE est
enregistré dans syscomments. Lorsque vous exécutez une procédure pour la première fois, elle est
compilée afin d'optimiser le plan d'accès pour la récupération des données.
Paramètres utilisant le type de données cursor
Les procédures stockées ne peuvent utiliser le type de données cursor que pour les paramètres
OUTPUT. Si le type de données cursor est spécifié pour un paramètre, les paramètres VARYING et
OUTPUT sont alors obligatoires. Si le mot clé VARYING est spécifié pour un paramètre, le type de
données doit obligatoirement être cursor et il faut spécifier le mot clé OUTPUT.
Remarque : Le type de données cursor ne peut pas être lié à des variables d'application par
l'intermédiaire des API de base de données, telles que OLE DB, ODBC, ADO et DB-Library. Les
paramètres OUTPUT devant être liés avant qu'une application puisse exécuter une procédure
stockée, les procédures stockées qui contiennent des paramètres OUTPUT de type cursor ne
peuvent pas être appelées à partir des API de bases de données. Ces procédures ne peuvent être
appelées à partir des procédures stockées, des déclencheurs ou des lots d'instructions Transact-
SQL que lorsque la variable OUTPUT de type cursor est affectée à une variable Transact-SQL
locale de type cursor.
Les règles suivantes régissent les paramètres de sortie de type cursor lors de l'exécution de la
procédure :
Dans le cas d'un curseur en avant uniquement, les lignes renvoyées dans le jeu de résultats du curseur
sont seulement celles situées à la position du curseur ou au-delà de celui-ci, à la fin de l'exécution de la
procédure stockée, par exemple :
Un curseur ne permettant pas le défilement est ouvert dans une procédure, dans un jeu de résultats de
100 lignes, appelé RS.
Le jeu de résultats RS renvoyé à l'appelant est constitué des lignes 6 à 100 de RS et le curseur dans
l'appelant est placé avant la première ligne de RS.
Dans le cas d'un curseur en avant uniquement, si le curseur se trouve avant la première ligne après
l'achèvement de la procédure stockée, la totalité du jeu de résultats est renvoyée au lot d'instructions, à
la procédure stockée ou au déclencheur appelant. Lorsqu'elle est renvoyée, la position du curseur est
fixée au début de la première ligne.
Dans le cas d'un curseur en avant uniquement, si le curseur est placé au-delà de la fin de la dernière
ligne après l'achèvement de la procédure stockée, le système renvoie un jeu de résultats vide au lot
d'instructions, à la procédure stockée ou au déclencheur appelant.
Dans le cas d'un curseur permettant le défilement, toutes les lignes du jeu de résultats sont renvoyées
au lot d'instructions, à la procédure stockée ou au déclencheur appelant à la fin de l'exécution de la
procédure stockée. Lors du renvoi, la position du curseur est conservée à la position de la dernière
extraction exécutée dans la procédure.
Pour tous les types de curseur, si le curseur est fermé, une valeur NULL est repassée au lot
d'instructions, à la procédure stockée ou au déclencheur appelant. Cette situation se produit également
si un curseur est affecté à un paramètre mais qu'il n'a jamais été ouvert.
Remarque : L'état fermé n'a d'importance qu'au moment du retour. Par exemple, vous pouvez
fermer un curseur au cours de l'exécution de la procédure, le rouvrir plus tard dans la procédure et
renvoyer le jeu de résultats de ce curseur au lot d'instructions, à la procédure stockée ou au
déclencheur appelant.
Procédures stockées temporaires
SQL Server prend en charge deux types de procédures stockées temporaires : local et global. Seule la
connexion qui crée une procédure temporaire locale peut voir cette procédure. Une procédure
temporaire globale est accessible par toutes les connexions. Les procédures temporaires locales sont
supprimées automatiquement à la fin de la session en cours. Les procédures temporaires globales sont
supprimées à la fin de la dernière session qui utilise la procédure, généralement, quand la session qui a
créé la procédure se termine.
Les procédures temporaires nommées avec # et ## peuvent être créées par n'importe quel utilisateur.
Lorsque la procédure est créée, le propriétaire de la procédure locale est le seul à pouvoir l'utiliser.
L'autorisation d'exécuter une procédure temporaire locale ne peut pas être accordée à d'autres
utilisateurs. Si une procédure temporaire globale est créée, tous les utilisateurs peuvent y accéder ; les
permissions ne peuvent pas être révoquées de manière explicite. La création explicite d'une procédure
temporaire dans tempdb (nommée sans le signe dièse) ne peut se faire que par les personnes possédant
l'autorisation explicite CREATE PROCEDURE dans la base de données tempdb. L'autorisation peut
être accordée et révoquée pour ces procédures.
Remarque : Une utilisation importante des procédures stockées temporaires peut créer une
contention sur les tables systèmes dans tempdb et réduire les performances. Il est recommandé
d'utiliser sp_executesql à la place. sp_executesql ne stocke pas les données dans les tables systèmes et
évite ainsi le problème.
Exécution automatique des procédures stockées
Il est possible de lancer l'exécution automatique d'une ou plusieurs procédures stockées au démarrage
de SQL Server. Les procédures stockées doivent être créées par l'administrateur système et exécutée
sous le rôle de serveur fixe sysadmin en tant que processus d'arrière-plan. La ou les procédure(s) ne
peuvent pas comprendre de paramètres d'entrée.
Le nombre de procédures au démarrage est illimité mais gardez à l'esprit que chacune utilise une
connexion lors de son exécution. Si vous devez exécuter plusieurs procédures au démarrage mais que
vous ne devez pas les exécuter de manière parallèle, utilisez comme procédure de démarrage, une des
procédures qui appellera les autres. Ceci permet de n'utiliser qu'une seule connexion.
L'exécution des procédures stockées commence lorsque la dernière base de données est restaurée au
démarrage. Afin d'éviter de lancer ces procédures stockées, spécifiez l'indicateur de traces 4022
comme paramètre de démarrage. Si vous lancer SQL Server avec la configuration minimale, (à l'aide
de l'indicateur -f), les procédures stockées de démarrage ne sont pas exécutées.
Pour créer une procédure stockée de démarrage, vous devez être connecté en tant que membre du rôle
de serveur fixe sysadmin et créer la procédure stockée dans la base de données master.
Les procédures stockées peuvent être imbriquées, en ce sens qu'une procédure stockée en appelle une
autre. Le niveau d'imbrication est incrémenté lorsque la procédure appelée commence à s'exécuter, et
décrémenté lorsque l'exécution est terminée. Le dépassement des niveaux d'imbrication maximum
autorisés, provoque l'échec de la totalité de la chaîne de procédures appelante. Le niveau d'imbrication
actuel est renvoyé par la fonction @@NESTLEVEL.
Autorisations
Les autorisations CREATE PROCEDURE reviennent par défaut aux membres du rôle de serveur fixe
sysadmin et des rôles de base de données fixes db_owner et db_ddladmin. Les membres du rôle de
serveur fixe sysadmin et du rôle de base de données fixe db_owner peuvent transmettre les
autorisations CREATE PROCEDURE à d'autres utilisateurs. L'autorisation d'exécution d'une
procédure stockée est accordée au propriétaire de la procédure, qui peut définir une autorisation
d'exécution pour d'autres utilisateurs de la base de données.
Exemple
A. Utiliser une procédure simple avec une instruction SELECT complexe
Cette procédure stockée renvoie tous les auteurs (nom et prénom), leurs titres et leurs éditeurs à partir
d'une jointure de quatre tables. Cette procédure stockée n'utilise aucun paramètre.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info_all' AND type = 'P')
DROP PROCEDURE au_info_all
GO
CREATE PROCEDURE au_info_all
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
GO
Cette procédure stockée ne renvoie que les auteurs spécifiés (nom et prénom), leurs titres et leurs
éditeurs à partir d'une jointure de quatre tables. Cette procédure stockée accepte les correspondances
exactes pour les paramètres passés.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info' AND type = 'P')
DROP PROCEDURE au_info
GO
USE pubs
GO
CREATE PROCEDURE au_info
@lastname varchar(40),
@firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON t.title_id = ta.title_id INNER JOIN publishers p
ON t.pub_id = p.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
GO
Cette procédure stockée ne renvoie que les auteurs spécifiés (nom et prénom), leurs titres et leurs
éditeurs à partir d'une jointure de quatre tables. Ce modèle de procédure stockée fait correspondre les
paramètres passés ou, s'ils ne sont pas fournis, utilise les valeurs par défaut prédéfinies.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'au_info2' AND type = 'P')
DROP PROCEDURE au_info2
GO
USE pubs
GO
CREATE PROCEDURE au_info2
@lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
AS
SELECT au_lname, au_fname, title, pub_name
L'exécution de la procédure stockée au_info2 peut s'effectuer selon plusieurs combinaisons. Vous
trouverez ci-dessous certaines de ces combinaisons :
EXECUTE au_info2
-- Or
EXECUTE au_info2 'Wh%'
-- Or
EXECUTE au_info2 @firstname = 'A%'
-- Or
EXECUTE au_info2 '[CK]ars[OE]n'
-- Or
EXECUTE au_info2 'Hunter', 'Sheryl'
-- Or
EXECUTE au_info2 'H%', 'S%'
Les paramètres OUTPUT permettent à une procédure externe, un lot d'instructions ou à plus d'une
instruction Transact-SQL d'accéder à un ensemble de valeurs pendant l'exécution de la procédure.
Dans cet exemple, une procédure stockée (titles_sum) est créée et accepte un paramètre d'entrée
facultatif et un paramètre de sortie.
Remarque La variable OUTPUT doit être définie au cours de la création de la table ainsi que
pendant l'utilisation de la variable.
(3 row(s) affected)
Les paramètres OUTPUT de type cursor servent à renvoyer un curseur local à une procédure, au lot
d'instructions appelant, à la procédure stockée ou au déclencheur.
Commencez par créer la procédure qui déclare puis ouvre un curseur dans la table titles :
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_cursor' and type = 'P')
DROP PROCEDURE titles_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
AS
SET @titles_cursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT *
FROM titles
OPEN @titles_cursor
GO
Ensuite, exécutez un lot d'instructions qui déclare une variable curseur locale, exécute la procédure
pour affecter le curseur à la variable locale et extrait les lignes du curseur.
USE pubs
GO
DECLARE @MyCursor CURSOR
EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
WHILE (@@FETCH_STATUS = 0)
BEGIN
FETCH NEXT FROM @MyCursor
END
CLOSE @MyCursor
DEALLOCATE @MyCursor
GO
F. Utiliser l'option WITH RECOMPILE
La clause WITH RECOMPILE est utile lorsque les paramètres fournis à la procédure ne sont pas
typiques et lorsqu'un nouveau plan d'exécution ne doit pas être mis en mémoire cache ou stocké dans
la mémoire.
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'titles_by_author' AND type = 'P')
DROP PROCEDURE titles_by_author
GO
CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = '%'
WITH RECOMPILE
AS
SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
title AS Title
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id INNER JOIN titles t
ON ta.title_id = t.title_id
WHERE au_lname LIKE @@LNAME_PATTERN
GO
G. Utiliser l'option WITH ENCRYPTION
La clause WITH ENCRYPTION cache le texte de la procédure stockée aux utilisateurs. Cet exemple
crée une procédure cryptée, utilise la procédure stockée du système sp_helptext pour obtenir des
informations sur cette procédure cryptée puis tente d'obtenir directement des informations sur cette
procédure dans la table syscomments.
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'encrypt_this' AND type = 'P')
DROP PROCEDURE encrypt_this
GO
USE pubs
GO
CREATE PROCEDURE encrypt_this
WITH ENCRYPTION
AS
SELECT *
FROM authors
GO
Remarque La valeur de la colonne text apparaît sur une ligne séparée. Lorsqu'elle est exécutée, cette
information apparaît sur la même ligne que l'information relative à la colonne id.
id text
---------- ------------------------------------------------------------
1413580074 ?????????????????????????????????
e??????????????????????????????????????????????????????????????????????????
(1 row(s) affected)
H. Créer une procédure stockée du système définie par l'utilisateur
Cet exemple crée une procédure qui permet d'afficher toutes les tables dont le nom commence par la
chaîne emp, ainsi que leurs index correspondants. En l'absence de cette chaîne, la procédure renvoie
toutes les tables (et les index) dont le nom commence par sys.
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'sp_showindexes' AND type = 'P')
DROP PROCEDURE sp_showindexes
GO
USE master
GO
CREATE PROCEDURE sp_showindexes
@@TABLE varchar(30) = 'sys%'
AS
SELECT o.name AS TABLE_NAME,
i.name AS INDEX_NAME,
indid AS INDEX_ID
FROM sysindexes i INNER JOIN sysobjects o
ON o.id = i.id
WHERE o.name LIKE @@TABLE
GO
USE pubs
EXEC sp_showindexes 'emp%'
GO
(2 row(s) affected)
Cet exemple montre quatre procédures et les différentes manières d'utiliser la résolution de nom
différée. Chaque procédure stockée est créée, même si la table ou la colonne référencée n'existe pas au
moment de la compilation.
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'proc1' AND type = 'P')
DROP PROCEDURE proc1
GO
-- Creating a procedure on a nonexistent table.
USE pubs
GO
CREATE PROCEDURE proc1
AS
SELECT *
FROM does_not_exist
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
ON o.id = c.id
WHERE o.type = 'P' AND o.name = 'proc1'
GO
USE master
GO
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'proc2' AND type = 'P')
DROP PROCEDURE proc2
GO
-- Creating a procedure that attempts to retrieve information from a
-- nonexistent column in an existing table.
USE pubs
GO
CREATE PROCEDURE proc2
AS
DECLARE @middle_init char(1)
SET @middle_init = NULL
SELECT au_id, middle_initial = @middle_init
FROM authors
GO
-- Here is the statement to actually see the text of the procedure.
SELECT o.id, c.text
FROM sysobjects o INNER JOIN syscomments c
ON o.id = c.id
WHERE o.type = 'P' and o.name = 'proc2'
Exercices
Reprendre le cahier des charges GOELAND et traiter les demandes suivantes en procédures stockées :
Procédure 1 :
On souhaite obtenir par modèle la moyenne des heures de vol des avions.
Procédure 2 :
On souhaite obtenir pour une date donnée la liste des réservations par ligne, vol et étape, passer la date
en paramètre.
Distinguer la classe touriste de la 1ere classe ; préciser le nombre de personnes .
Procédure 3 :
Procédure 4 :
- Vérifier que cette personne est bien active (code activité = 'A')
- Vérifier que cette personne n'est pas affectée à un autre vol sur les mêmes dates
- Vérifier que la date du vol pour cette affectation est égale à date de dernière affectation plus
2 jours.
- Vérifier qu'il n'y a pas pour :
- Les pilotes : plus de deux déjà affectés
- Les hotesses : plus de trois déjà affectées
- Les stewards : plus de 1 déjà affecté
- Renvoyer la liste des personnels affecté à ce vol après cette affectation
Forme évoluée de règles utilisées pour renforcer l’intégrité de la base de données, particulièrement
l’intégrité référentielle.
Le plus souvent on parle de TRIGGERS.
Principes:
Les triggers sont déclenchés automatiquement par le noyau SQL à chaque intervention sur la table qui les
supportent.
Précautions à prendre.
Un trigger est toujours associé à une table, il est impossible de l’associer à une vue ou a une table
temporaire.
Une table peut avoir au maximum trois triggers, chacun étant déclenché en fonction de l’événement
détecté sur la table
Insertion de ligne
modification de ligne
suppression de ligne
Chaque trigger est facultatif et une table peut n’avoir aucun trigger
D’autre part, un trigger ne s’applique qu’à une seule table, plusieurs tables ne pouvant pas utiliser le
même trigger.
Principe de fonctionnement.
Les tables INSERTED et DELETED peuvent être utilisées par le trigger pour déterminer
comment le traitement doit se dérouler.
Les mécanismes d’utilisation par SQL Server de ces deux tables diffèrent en fonction de
l’opération effectuée sur la table contenant le ou les triggers.
Les triggers doivent être créés juste après la création de la table de sorte que l’intégrité
référentielle des données soit assurée.
Les triggers définis sur la base de données ont deux rôles principaux:
- contrôler que les données manipulées vérifient l’intégrité référentielle, c’est à dire que
les tables restent synchronisées.
Exemple 1 : « Un avion ne peut être créé que si le modèle qui lui correspond existe
déjà dans la base »
BEGIN
END
Exemple 2 : « Un modèle ne peut être supprimé que si aucun avion ne correspond
à ce modèle dans la base de données »
BEGIN
Exemple 3 .
BEGIN
IF UPDATE (CODEMODELE_MODELE)
BEGIN
IF (SELECT count(*) FROM MODELE, inserted
WHERE MODELE.NUMMOD = inserted. NUMMOD) = 0
BEGIN
PRINT 'Déclencheur Update sur Avion. Modèle inexistant,
vous ne pouvez pas le modifier.'
ROLLBACK TRANSACTION
RETURN
END
END
END
Certaines règles de gestion concernant les données de la base peuvent être prises en
compte dans le base de données elle-même, de telle manière que la synchronisation
des données soit indépendante des traitements effectués.
Exemple 4.
« Un vol effectué à une certaine date ne doit embarquer que deux pilotes »
/*----------------------------------------------------------------------------*/
/* Règle de gestion: un vol embarque deux pilotes */
/* Mise en place sur TRIGGER INSERT */
/*----------------------------------------------------------------------------*/
ROLLBACK TRANSACTION
END
Dans l’exemple ci-dessus, une partie seulement du trigger a été listé, elle concerne
exclusivement l’application de la règle sur le pilote.
Exemple 5.
BEGIN
ELSE
BEGIN
DELETE QUALIFICATION FROM QUALIFICATION, DELETED
WHERE NUMMOD = DELETED. NUMMOD
PRINT 'Qualifications correspondant au modèle. Suppression
effectuée.'
END
END
Une opération sur une table déclenche automatiquement, s’il existe, le trigger correspondant à
l’opération.
Si le trigger déclenché effectue une opération sur une autre table, les triggers associés à cette
table sont alors déclenchés.
C’est ce que l’on qualifie de cascade.
Le nombre de niveaux cascadés est fonction du SGBD (16 en SQL Server).
Exemple.
« Dans la base de données Avions; on décide qu’à la suppression d’un avion, on vérifiera s’il
existe d’autres avions du même modèle. S’il s’agit du dernier avion de ce modèle dans la base,
on détruira le modèle en question de la table des modèle.
Hors le fait de détruire un modèle entraîne la destruction par trigger des lignes
de qualification des pilotes pour ce modèle. (cf exemple 5) ».
Mise en oeuvre.
BEGIN
BEGIN
SELECT @mod = (SELECT NUMMOD from deleted)
PRINT 'Déclencheur DELETE sur Avion. Plus aucun avion pour le
modèle'
PRINT @mod
DELETE MODELE WHERE NUMMOD = @mod
END
END
END
BEGIN
Ou
Coder le traitement du trigger à partir de la fenêtre de saisie que vous propose SQL
Server. Utilisation de l’éditeur.
Le fait de demander la création d’un déclencheur, SQL Server propose une trame de séquence
SQL pouvant être modifiée.
Exercices
sur la base de données GOELAND (voir dossier gestion d'une compagnie aérienne, étude de cas)
Triggers de création
Table vol
Vérifier que date de vol inférieure ou égale date d'arrivée et heure de départ
inférieur heure d'arrivée.
Table modèle
Vérifier poids à vide inférieur à poids maxi
Table Personnel
Vérifier la cohérence des dates
Date naissance inférieure date embauche inférieure ou égale date fin de contrat et date
décès non renseignée.
Table personnel
- Interdire modification sur le sexe et date de naissance
Triggers de suppression
Table Réservation
XIV. Curseurs(CURSOR)
Les curseurs permettent de réaliser des traitements itératifs sur des jeux de résultats,
comme le balayage d’une table enregistrement par enregistrement par exemple.
Syntaxe
Arguments :
cursor_name
Nom du curseur de serveur Transact-SQL défini. L'argument cursor_name doit respecter les
conventions se rapportant aux identificateurs.
select_statement
Instruction SELECT standard qui définit le jeu de résultats du curseur. Les mots-clés
COMPUTE,COMPUTE BY, FOR BROWSE et INTO ne sont pas autorisés dans l'instruction SELECT
d'une déclaration de curseur.
Microsoft SQL Server convertit implicitement le curseur en un autre type si les clauses de l'instruction
SELECT sont incompatibles avec la fonctionnalité du type de curseur requis.
L'instruction DECLARE CURSOR définit les attributs d'un curseur de serveur Transact-SQL,
notamment s'il permet ou non le défilement, et la requête utilisée pour créer le jeu de résultats sur lequel
le curseur opère. L'instruction OPEN remplit le jeu de résultats tandis que l'instruction FETCH renvoie
une ligne à partir de ce jeu de résultats. L'instruction CLOSE libère le jeu de résultats actuel associé au
curseur. L'instruction DEALLOCATE libère les ressources utilisées par le curseur.
Les variables peuvent être utilisées dans l'argument select_statement qui déclare un curseur. Toutefois,
les modifications apportées à ces variables après la déclaration du curseur sont sans effet sur le
fonctionnement de celui-ci.
Autorisations
Les autorisations DECLARE CURSOR sont octroyées par défaut à tout utilisateur qui a des
autorisations SELECT sur les vues, les tables et les colonnes utilisées par le curseur.
Exemple
A. Utilisation d'un curseur et d'une syntaxe simples
Le jeu de résultats généré à l'ouverture du curseur ci-après contient toutes les lignes et toutes les
colonnes de la table authors de la base de données pubs. Ce curseur peut être mis à jour et toutes les
mises à jour et suppressions sont représentées par des extractions à partir de ce curseur. L'option
SCROLL n'ayant pas été spécifiée, seule l'extraction FETCH NEXT est disponible.
DECLARE authors_cursor CURSOR
FOR SELECT * FROM authors
OPEN authors_cursor
FETCH NEXT FROM authors_cursor
L'exemple suivant montre comment les curseurs peuvent être imbriqués pour produire des rapports
complexes. Le curseur interne est déclaré pour chaque auteur.
SET NOCOUNT ON
OPEN authors_cursor
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT " "
SELECT @message = "----- Books by Author: " +
@au_fname + " " + @au_lname
PRINT @message
OPEN titles_cursor
FETCH NEXT FROM titles_cursor INTO @title
IF @@FETCH_STATUS <> 0
PRINT " <<No Books>>"
WHILE @@FETCH_STATUS = 0
BEGIN
END
CLOSE titles_cursor
DEALLOCATE titles_cursor
CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
Autorisations
Les autorisations FETCH reviennent par défaut à tous les utilisateurs valides.
exemple
A. Utilisation de FETCH dans un curseur simple
Cet exemple déclare un simple curseur pour les lignes de la table authors dont le nom commence par
B, et il utilise FETCH NEXT pour parcourir les lignes. L'instruction FETCH renvoie la valeur de la
colonne spécifiée dans DECLARE CURSOR comme un jeu de résultats sur une seule ligne.
USE pubs
GO
DECLARE authors_cursor CURSOR FOR
SELECT au_lname FROM authors
WHERE au_lname LIKE "B%"
ORDER BY au_lname
OPEN authors_cursor
CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
au_lname
----------------------------------------
Bennet
au_lname
----------------------------------------
Blotchet-Halls
au_lname
----------------------------------------
B. Utilisation de FETCH pour stocker des valeurs dans des variables
Cet exemple ressemble au précédent, excepté que le résultat des instructions FETCH est stocké dans
des variables locales plutôt que d'être directement renvoyé au client. L'instruction PRINT combine les
variables dans une chaîne unique et les renvoie au client.
USE pubs
GO
OPEN authors_cursor
CLOSE authors_cursor
DEALLOCATE authors_cursor
GO
I. TP1
Ce présent TP est composé de plusieurs exercices à réaliser sur machine. l’objectif de ce TP
vise à ce que le stagiaire soit capable à la fois d’écrire et d’analyser un code T-
SQL. Les exercices doivent être réaliser avec l’outil « analyseur de requêtes ».
Exercice 1
Éléments de réponse :
Pour résoudre cette équation, il est clair qu’on aura besoin de déclarer un ensemble de
variables, après il faut utiliser des structures alternatives imbriquées.
A ne pas oublier : le caractère @ est obligatoire dans la déclaration des variables locales.
Structure alternative:
If (condition)
…
Else
If(condition)
…
Else
…
NB :delta=b²-4ac
Exercice 2
A ne pas oublier : Il existe que deux structure itérative en T-SQL qui sont
While (condition)
-instruction ou bloc d’instructions
et
étiquette :
-instruction ou bloc d’instructions
if(condition) goto étiquette
II. TP2
Ce présent TP est composé d’un exercice à réaliser sur machine. l’objectif de ce TP vise à
ce que le stagiaire soit capable à la fois d’analyser un problème et de le traduire
dans T-SQL. L’exercice doit être réaliser avec l’outil « analyseur de requêtes ».
Exercice 1
Écrire un programme qui permet d’afficher le jour qui corresponds à une date donnée.
Exemple :
30/03/1978 correspond au Jeudi
NB : cette fonction existe en T-SQL, elle a comme nom DateName
Ex : select Datename(w,'30/03/1978') --affiche Jeudi
éléments de réponse :
d’abord il faut connaître, combien de jours est composé une année? (il faut étudier le cas
d’une année bissextile?)
Après il faut ajouter le nombre de jours des mois écoulés à partir du mois 12 (par exemple)
Enfin il faut ajouter à tout cela le nombre de jours écoulé pour le mois en cours.
Calculer le modulo 7 de ce nombre, et puis selon le jour pris en référence, il faut déduire
résultat?
Exercice 2
NB : dans cet exercice seul l’ordre select * from stagiaire est autorisé
Éléments de réponse :
dans cet exercice le stagiaire est appelé à analyser le problème puis de concrétiser ses idées
sous formes de script T-SQL.
Il y a deux solutions au moins que le stagiaire peut envisager?
PREMIERE SOLUTION : créer une table temporaire ou on va stocker à chaque fois le Max
des éléments qui restent de la table stagiaires, puis on affiche le tout à partir de cette table
temporaire.
III. TP 3
Ce présent TP est composé d’un exercice à réaliser sur machine. l’objectif de ce TP vise à
ce que le stagiaire soit capable à la fois d’analyser un problème et de progrmmer
des procédures stockées. L’exercice doit être réaliser avec l’outil « analyseur de
requêtes ».
Questions :
1) Ecrire des procédures stockées qui permettent de :
A ne pas oublier :
Syntaxe :
CREATE PROC nom_de_procédure @p type [output],@p2 type
[output ], … AS ordre_SQL
IV. TP 4
Ce présent TP est composé d’un exercice à réaliser sur machine. l’objectif de ce TP vise à
ce que le stagiaire soit capable à la fois d’analyser un problème et de programmer
des triggers. L’exercice doit être réaliser avec l’outil « analyseur de requêtes ».
Soit le MCD (vu précédemment) suivant d’une gestion de coupe mondiale 1986.
Questions :
- Lors de l’ajour d’une personne, on met son nom en majuscule ainsi que le premier
caractère de son prénom
- Lors de l’ajout d’un match on vérifie si le nombre de spectateurs est inférieur ou
égale au nombre de places disponibles dans le stade ? si oui on l’ajoute sinon on
affiche un message d’erreur?
- Lors de l’insertion d’un but on vérifie si la minute est positive ?
- Lors de la suppression d’un joueur on supprime aussi les buts qu’il a marqué ?
- Interdire de modifier la date d’un match ?
- Lors de la suppression d’une équipe on supprime les joueurs ?
- Lors de la suppression d’une équipe on supprime les joueurs et leurs buts?
- Lors de l’ajout d’une équipe si on essaye d’insérer dans le champs nationalité
« Fr » alors on la modifie en France
« Mr » « Maroc »
« br » « Brésil»
« esp » « Espagne »
A ne pas oublier :
syntaxe
www.google.com