Transact SQL en vue de programmation
Transcription
Transact SQL en vue de programmation
ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 Transact SQL en vue de programmation Avec Entreprise Manager, vous êtes capable de créer une base de données et ses tables, vues, etc et de l’administrer. Mais si devez accéder à cette base via des programmes externes comment faire ? Dans tous les langages vous avez des fonctions qui permettent de se connecter à des BD, ensuite il ne reste plus qu’à exécuter des ordres SQL (pour SQLserver et Sybase TransacSQL). Ces commandes sont généralement écrites dans des chaînes de caractères, nous verrons cela dans de futurs cours. Actuellement attachons nous à savoir écrire les ordres pour les introduire dans des programmes, en fichiers batch ou procédures stockées). Beaucoup de commandes système commencent par "sp_" pour avoir de l’aide sur un objet : sp_help nom_objet Besoin aide, "Aide sous l’analyseur de requêtes", toute la documentation de Transac SQL s' y trouve. Ici nous voyons que la partie émergée de SQLServer et TRANSACSQL Choix de BD. Savoir sur quelle base sommes nous ? Lancer SQLServer et Analyseur de requête (quitter Entreprise Manager). Taper : select db_name() : réponse base sur laquelle vous êtes connectée Pour aller sur la base Pubs : use pubs use nom_base Taper : select db_name() Rappel : Un Objet d’une base de données porte un nom et occupe de l’espace dans cette base de données. Plusieurs objets de la BD utilisent des tables. Affecter à la table Affecter à des colonnes de la le trigger qui peuvent lancer : trigger et tables. procédures stockées, vues. Valeur par défaut La procédures stockées peuvent lancer Type de données PS et vues. Règles de gestion Les vues peuvent lancer d’autres vues. Index. Types Création de types défini par l’utilisateur. : sp_addtype "montype","type system", "null | not null". Ensuite vous pouvez l’utiliser pour la création de variables. C' est pour obtenir plus de standard. Pour avoir des infos sur le type, sp_help EXERCICES : sp_addtype montype , "varchar(6)" , "not null" sp_help montype sp_droptype montype Rappel sur les différents types de données. Bancquart Page 1 sur 1 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL Type Smallint int Numeric(p,s) decimal(p,s) Float double real Smalldatetime Datetime Char(n) varchar(n) nchar(n) Nvarchar(n) Money Binary(n) varbinary(n) Image Bit Nombre d'octets 2 04/01/03 Limite de valeur -32768 à 32768 +/- 2147483647 -1038 à 1038 Exemple 88 15000 3,14 4 ou 8 Fonction de la machine 3,1415976.. 4 1/1/1900 à 6/6/2079 1/1/1763 à 12/31/9999 255 caractères 17-6-2001 4 2 à 17 8 4 8 N longueur de l’entrée peut comporter des espaces suppriment les blancs à la fin 8 N fonction de l’entrée Multiple de 2 Ko 1 =/-922337203685477 255 octets Fct pays 0 ou 1 Intégrité des données et tables. Tables • • Table : Constituée de lignes et de colonnes, pour chaque colonne définir le type et propriété. Type : système ou types de données définis par l'utilisateur. Remarque : Dans les tables, l’on peut avoir des colonnes identity , cad que la valeur s’incrémente de 1 à chaque enregistrement créé, il ne faut le faire dans un ordre select. La syntaxe de création de table : Create table nom_table (nom_colonne datatype [identity|null|not null , (nom_colonne datatype [identity|null|not null , …) EXERCICES : create table VentesAuDetail (stor_id char(4) not null, title_id varchar(20) not null, quantite smallint not null, remise float null ) select * from VentesAuDetail En complément nous avons : sp_help, sp_rename , drop table et alter table Voir DOC. Tables temporaires Elles sont utilisées pour contenir un ensemble de résultats intermédiaires, elles commencent par le signe # . Possibilité d'utiliser la commande Select into., qui permet d’insérer directement des données à partir d’un select. SQLServer supprime automatiquement les tables temporaires à la déconnexion. Bancquart Page 2 sur 2 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 Exemple : la table temporaire utilisée dans cet exemple contient un ensemble de résultats intermédiaires. Ils désignent les livres pour lesquels les commandes dépassent la moyenne dans la tables sales. select title_id, total_orders = sum(qty) into #qty_table from sales group by title_id select t.title_id , title , total_orders from titles t, #qty_table qt where t.title_id = qt.title_id and total_orders > (select avg(total_orders) from #qty_table) select select_list into nom_nouvelle_table from nom_ancienne_table where condition Le select into permet de créer et copier la structure d’une table dans une autre avec une clause where éventuellement. Exercice : select * into newtitles from titles where pubdate < "jan 1, 1993" Vous avez une erreur, c’est normal. En tant qu’administrateur des options à configurer, voyons cela. Exercice : Sur l’aide de transac cherchez sp_dboption , voyez les options à mettre en service ou non possible, Le Select Into est parfois mis (pratique mais dans ce cas vous autoriser l’utilisateur X à créer des tables de façon détournée) Faire : sp_dboption pubs , "select into" , TRUE. Terminez l' exercice précédent. VUES Est le stockage d’une instruction SELECT fonctionnant comme une table Ne stocke pas les données Peut effectuer des sélections à partir de plusieurs tables et être utilisée pour contenir des données partielles d’une ou plusieurs tables. La vue est dynamique, si une donnée de tables change et quelle soit projetée dans une vue, alors celle ci change aussi EXERCICE : create view ca_authors as select au_id , au_lname , au_fname from authors where state = "CA" Ensuite visualiser notre vue : select * from ca_authors Une vue peut inclure : une fonction d' agrégat et regroupement; jointure, autre vue, clause where, un distinct. Mais elle ne peut pas inclure : order by, compute , select into. Contraintes. Contraintes intégrité, d'unicité, clé primaire. ¾ Default : s'applique à une insertion si pas de valeur est indiquée. ¾ Vérification : Précise une liste ou fourchette de valeurs, vérifier une condition. Create table table nom_table (nom_colonne datatype [constraint nom_contrainte] check (search_condition) .. exemple à la table discounts vérifier que la quantité maxi soit supérieur quantité mini : constraint low_high_check check (lowqty < highqty) Bancquart Page 3 sur 3 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 Pour être parlant on peut ajouter des messages. Sp_addmessage 20002 « lowqty indiqué est supérieur à highqty » Ensuite on affecte ce message à la contrainte. Sp_bindmsg low_high_check 20002 Si les données sont rejetées par la contrainte alors messages au client. Voir Doc Exercice ajouter la contrainte à la table discount alter table discounts add constraint low_high_check check (lowqty < highqty) INDEX C'est une structure de stockage indépendante, créée en plus, c'est un objet distinct dans la BD La création d'un index améliore les performances en réduisant les lectures de pages nécessaires pour retrouver des données. Garantit l'unicité. ¾ Index Clustérisés : Intéressant sur la jointure la plus courante, % élevé de duplication. Ils améliorent fortement les performances de la base, mais attention il ne peut y avoir qu'un seul index clusterisé par table (place en base). ¾ Index non clusterisés : ne reclassent pas les données et n'affectent pas les pages de données. Ils fournissent des pointeurs aux lignes de la table, 249 index maxi, ils sont plus longs en traitement. UNICITE et CLE PRIMAIRE Une valeur ne peut se trouver sur plus d'une seule ligne, donc un seul null, création d'index automatique. Create table nom_table (non colonne type [ constraint non_contrainte] unique [clustered|nonlustered] Idem avec primary key Règles Objet de la BD qui définit une restriction appliquée à une colonne, assure l'intégrité d'un domaine, s'applique à une colonne ou un type. Les règles et les valeurs par défaut peuvent être associées à plusieurs colonnes. Elles peuvent être visualisées avec SP_HELPTEXT. Elles sont stockées dans la BD et donc modifiable pour l'ensemble de la BD. Create rule nom_regle as expression Sp_bindrule nom_regle , nom_objet.colonne ALTER TABLE : modification de structure de tables. Ajouter des colonnes, ajouter, modifier ou éliminer des contraintes. Il est interdit de supprimer des colonnes ou modifier un type. A l'ajout d'une contrainte, les données présentes dans la table ne sont pas affectées. Manipulation de données Insertion et MAJ de données. ¾ INSERT : ajoute une ou plusieurs lignes à une table existante. Bancquart Page 4 sur 4 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 Liste de colonne pour la table est facultative, pour ajouter des valeurs null, ne pas indiquer la colonne dans la liste : Insert [into] nom_table [(liste_colonne)] { values (expression, [expression] …) | instruction select Exercice : insert publishers values ("9934" , "germinal" , "Dunkerque", "NO", "FR") UPDATE : modifie tout ou une partie d'une ligne existante : Update table set col = " val" update nom_table Set nom_colonne = « valeur » where condition EXERCICE : update discounts set discounttype = " remise maxi de philippe" where stor_id = 1000 update titles set price = price * 0.9 where pubdate < "JAN 1, 1993" ¾ DELETE : permet de supprimer les lignes d'une table avec ou non une restriction (where) delete publishers where state = "NO" ¾ TRUNCATE : Supprime toutes les lignes, il est plus rapide mais il supprime toutes les lignes. DELETE effectue une écriture dans le journal, on peut donc gérer des RollBack. Truncate impossible de revenir en arrière. Exercice : Insertion d’un enregistrement dans la table discount insert discounts values ("ma remise",1000, 5, 9, 6.4) Cela ne fonctionne pas, en effet l’identifiant magasin 1000 n’existe pas dans la table Stores. Nous voyons ici l’interêt des clés étrangères, il n’est pas possible de faire une erreur, cad affecter des commandes à un magasin qui n’existe pas. Création du magasin Philippe id=1000 insert stores (stor_id , stor_name) values (1000, "philippe") On précise que certains champs à insérer. Rejouer la commande Insert Î erreur insert discounts values ("ma remise",1000,5,9,6.4) : Par défaut tous les champs Suppression : Delete from nom_table where condition EXERCICE insert discounts values ("ma remise",6380,5,9,6.4) insert discounts values ("ma remise",6380,5,9,6.4) insert discounts values ("ma remise",6380,5,9,6.4) select * from discounts delete from discounts where stor_id = 6380 select * from discounts Convertions Fonction Syntaxe Substring Substring(expression, position départ,longeur) Right Rignht(chaine,longueur) Upper Upper(chaine) Charindex Charindex(masque,expression ascci Ascii(chaine) Char Char(nombre) Ltrim Ltrim(chaineà Space Space(nombre) Exemple Résultat Substring(“abcde”,2,2) “bc” Str Str(456.56 , 5 , 1) Bancquart Str(nb réel, longeur,nb_décimal) Right(“abcde”,3) Upper(abcde) Charindex(“bc”,”abcde” Asci(t) Char(84) Ltrim(« abcde » Space(2) Page 5 sur 5 “cde” ABCDE 2 84 T « abcde » 2 espaces insérés 456,6 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 Replicate Replicate(chaine,nombre) Relicate(« abc »,3) abcabcabc Transac effectue aussi des conversions implicite (entier vers réel par exemple) , sinon utiliser la fonction convert Convert( datatype , expression [,style] Ex : convert (char(10) , price) convertit la colonne prix (type monaie) en chaine de 10 caractères. select title_id , " nombre de livres vendus :" + convert (varchar(10), advance)from titles where title_id like "PS20%" La fonction convert . Modifie les expressions d’un type de données vers un autre. Indique de nouveaux formats ou des informations sur la date et l’heure. Style année 12 Format Style 4 chiffres Format chiffres 2 yy.mm.dd 102 Yyyy.mm.dd 3 DD/MM/yy 103 Dd/mm/yyyy 4 dd.mm.yy 104 dd.mm.yyyy 5 dd-mm-yy 105 dd-mm-yyyy EXERCICE select pubdate from titles where title_id = "MC3026" select convert(varchar(10) , pubdate , 105 ) from titles where title_id = "MC3026" select convert(varchar(8) , pubdate , 2 ) from titles where title_id = "MC3026" Fonctions DATES et mathématiques. Pour avoir la date : select getdate() Le nom d’une partie de date : Datename (élément_date ,date) : select datename(mm , getdate()) Valeur numérique datepart (element_date, date) : select datepart(mm , getdate()) Pour ajouter ou supprimer des temps : Dateadd( element_date , numero ,date) Calcul d’écart Datediff (element_date , premiere_date deuximeme date) EXERCICE select pubdate from titles where title_id = "BU1032" select dateadd (dd , -5 , pubdate ) from titles where title_id = "BU1032" Nombre de semaines écoulées depuis l’édition du titre "bu1032" select title_id , pubdate , datediff (wk , pubdate , getdate() ) from titles where title_id = "BU1032" Les fonctions mathématiques. ABS, ceiling, floor, round ,exp, rand, log, pi, power, sqt, sin, cos, tan Voir Documentation. Fonctions agrégat Count(*) : nb de ligne séelectionnées Count(col_name) : nb de valeurs non nulles dans une colonne Sum , avg , max , min (col_name) somme , moyenne , maximum et minimum d’une colonne Exercice select title_id , price from titles where price >(select avg(price)from titles) Bancquart Page 6 sur 6 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 fonction isnull est une fonction qui spécifie une value d'une entrée qui vaut "null" select avg(price) from titles si on remplace les prix null par zéro : select avg(isnull(price,0)) from titles Order by : classe les résultats de la requête par ordre croissants ou décroissants (colonnes simples, multiples, expression) select stor_id , title_id , qty from sales order by stor_id , title_id desc Pour créer un total général utilisez compute Pour effectuer un sous total , utilisez compute by avec order by select title_id , type, price from titles where type like "%cook%" order by type compute avg(price) by type Programmation sous transact SQL Le but est de convevoir des batch, cad des ensemble de manipulation de données, et tous cet ensemble reste cohérent pour la base. SQLserver examine la totalité du batch avant de lancer son exécution. S'il y a une erreur rien n'est exécuté. Comme tous programmes vous pouvez introduire des commentaires. /* commentaire */ Ensuite vous pouvez créer des : VARIABLES LOCALES Elles sont des entités définies et typées par l'utilisateur, toujours précédé de @ Declare @variable type ¾ L'affectation de valeurs par : select @variable=expression from Where ¾ Permet le branchement conditionnel en fonction d'une variable. ¾ Facilite le transfert de valeurs en provenance et destination des Procédures stockées. ¾ Renvoi à l'application des messages personnalisés. Exercice /* création variable taux de tva , évite de le mettre dans chaque select */ declare @tva float select @tva = 16.4 select "prix hors tva" = price , "prix avec tva" = floor(price + (@tva/100 * price)) from titles /* autre exemple d'utilisation */ declare @maMoyenne int select @maMoyenne = avg(ytd_sales) from titles select title_id from titles where ytd_sales > @maMoyenne Variables globales. La plupart des variables globales ont trait à l’activité du système, Elles sont exploitées par un certain nombre de procédures système telle que sp_monitor. @@CONNECTIONS : Nombre de logins depuis que SQLServer a été démarré. @@ERROR : Numéro de la dernière erreur générée par le système pour la connexion en cours. La variable globale @@ERROR est communément utilisée pour Bancquart Page 7 sur 7 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 tester le résultat (succeed or fail) de l’ordre SQL le plus récemment lancé. Il contient 0 si la dernière instruction exécutée s’est terminée correctement. @@ROWCOUNT : Nombres de lignes affectées par la dernière instruction. @@TRANCOUNT, Niveau imbrication des transactions. Exemple : IF @@ERROR < > 0 RETURN @@IDLE, @@IO_BUSY, @@LANGID, @@LANGUAGE, @@MAX_CONNECTIONS, @@NESTLEVEL, @@PACK_RECEIVED, @@PACK_SENT, @@PACKET_ERRORS, @@PROCID, @@CPU_BUSY, @@DBTS., @@SERVERNAME, @@SPID, @@TEXTSIZE, @@TIMETICKS, @@TOTAL_ERRORS, @@TOTAL_READ, @@TOTAL_WRITE, @@VERSION Contrôle de flux IF ELSE END Exécution conditionnelle d' une commande BEGIN END regroupement d' un bloc WHILE boucle GOTO retour à un libellé RETURN sortie inconditionnelle WAITFOR exécution liée à certains événements. Exemples Variables globales delete editeur where city = "nord" select @@version if @@rowcount = 0 declare @prix_livre money print " aucune ligne supprimée" select @prix_livre = price from titles else where title_id = “BU1032” print "ligne supprimée if @@rowcount = 0 print “pas de titre" else begin print " le prix de ce titre est:" select @prix_book end if ( select avg(price) from titles ) < 15 SI plus d' une instruction dans u n bloc /* double les prix */ mettre un begin et end update titles set price = price *2 if ( select avg(price) from titles ) < 15 /* augmente de 10% */ begin else if (select avg(price) from titles ) > 15 /* double les prix */ update titles set price = price *1.1 update titles set price = price *2 else print "prix doubles"i print "le prix moyen est inconnu" end /* augmente de 10% */ else if (select avg(price) from titles ) > 15 begin update titles set price = price *1.1 print "prix augmentés de 10%" end else print "le prix moyen est inconnu" Declare @lname varchar(40) If not exists (select * from titles where select @lname = "smith" titles_id = @t_id) if exist (select * from authors where Begin au_lname = @lname) select "il y a un +@lname Bancquart Page 8 sur 8 CPI-BD-Cours-Transac SQL.doc else select "aucun auteur s'appelle "+@lname ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL au_lname = @lname) select "il y a un +@lname else select "aucun auteur s'appelle "+@lname While (select avg(price) from titles ) <40 begin update titles set price = price +2 select max(price) from titles > 50 break end select title_id , price from titles print "trop cher" 04/01/03 Print "il n'y a pas de titre avec cet id" Return end Declare @nim_procs int , @dt datetime While 2 > 1 begin waitfor delay '0:20:00' insert into num_procs select getdate() , count(*) from master..syslocks end Renvoi de messages ¾ Générer une erreur fonctionnant comme une erreur système Raiserror error_number { message | @var } ¾ Retourner un message à l'utilisateur : Print accepte un argument mais pas une expression. Print "bonjour" Avec N argument : Print " la solution est %1! Et puis %2! ", @V1 , @V2 Gestion des transactions. Définition : Une transaction est une unité logique de travail. Cad séquence d'instruction SQL soumise à une BD. Ceci implique la modification d'au moins une donnée, fait passer la BD d'un état cohérent à un autre. Une transaction prend 2 états : "validée" "comitted" "échouée "rolled back" Une transaction exécutée ne peut pas être annulée, l'ensemble d'instruction est une entité logique. Tout est exécuté ou abandonné, pour effectuer cela SQLServer gère un journal des transactions. Gestion Sql serveur n'accepte dans la BD que des opérations validées (committed). Des utilisateurs multiples ont accès à une ou plusieurs bases de données. Des utilisateurs multiples ne peuvent pas accèder aux mêmes données en lecture et écriture simultanément. SQL server protège contre les problème logiciel, matériel, panne alimentation. Traitement des transactions. SQLServer gère un journal des transactions. SQLserver verrouille des pages de données au cours des transactions de façon à ce que d'autres utilisateurs ne puissent pas accéder à des données en cours de modification. SQLServer exécute une reprise automatique ( recovery ) lorsqu'il redémarre. Les instructions de contrôle des transactions déterminent à quel moment une transaction commence ou est annulée. Bancquart Page 9 sur 9 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 Mécanisme du journal des transactions. Chaque BD possède son journal, ils s'appellent SYSLOGS, géré exclusivement par SQLServer. Ce journal contient un enregistrement pour chaque modification apportée à la base de données dans l'ordre où elle a été effectuée. SQLServer met en mémoire les opérations de lecture et d'écriture de toutes les tables y compris la table SYSLOGS, dans une zone de mémoire appelée cache de données. Ce cache est composé de pages. Le flot des donnée est dans une transaction client Journal / données journal Donnée s Cache de données Gestion du cache Le journal des transactions est généralement distinct des véritables données de la base. Nous avons un vidage du cache vers le journal à chaque fois qu'une transaction est validée ou besoin de place dans le cache. Si un nombre de transaction a été validée, un point de reprise (check point) est réalisé pour cette BD. Une entrée de journal est effectuée pour indiquer qu'un point de reprise a été réalisé. Toutes les pages du cache sont transférées sur le périphérique de journal. Périodiquement en fonction du temps (ex toutes 5minutes) on effectue le checkpoint, Les transactions validées contenues dans le Log sont effectivement écrite en base, celles non validées restent dans le log. Cas de la reprise automatique : cas du redémarrage. Les transactions validées depuis le dernier point de reprise sont relancées (rolled forward) Les transactions qui n'ont pas pu être validées avant l'arrêt sont invalidées. Verrouillage : limite l'accès aux données lors de modification il est géré par SQLServer. Il est largement utilisé pour éviter tout conflit entre les transactions s'exécutant simultanément. Verrouillage de page : Un bloc de données est de 2Ko cela constitue la plus petite unité pouvant être lue ou écrite sur disque Type de verrous !: Partagé (lecture) : N process peuvent lire simultanément mais pas d'écriture en même temps. Bancquart Page 10 sur 10 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 Exclusif (écriture) : Un seul processus peut lire ou écrire, utilisé pendant les transactions. MAJ (verrou de lecture avant écriture), ce verrou devient exclusif quand la page est prête à être modifiée. Etreinte fatale : Cela se produit lorsque deux processus possèdent des verrous partagés sur une page pour laquelle chacun aurait besoin d'un verrou exclusif. Le serveur détecte automatiquement les étreintes fatales et supprime l'une des transactions. Variable globale @@translate ATTENTION : une transaction doit toujours se terminer par un COMMIT. Sinon elle reste dans le journal et n'est jamais écrite en base, les autres transactions s'empilent derrière dans ce journal, au bout et celui ci finit par saturer. CURSEURS. Permet à un programme d'avoir accès à chaque ligne du résultat d'une requête et non à la totalité des lignes retournées par une instruction select. Trait d'union entre l'orientation ensembliste d'une SGBD et la programmation séquentielle Possibilité de suppression ou modification d'une ligne dans une table à partir de la position du curseur. Declare : déclaration du curseur pour le traitement Open : ouverture du curseur Fetch : extraction de la ligne dans le curseur pour traitement. Répétition du processus d'extraction jusqu'à son terme ou son abandon. Close : fermeture du curseur. Delallocate : désallocation du curseur. /* déclaration du curseur sémantique d'une instruction SQL */ Declare nom_curseur cursor for select instruction /* ouverture du curseur */ Open nom_curseur /* extraction de lignes à partir d'un curseur ouvert */ Fetch nom_curseur into liste_fetch_target. /* tant qu'il y a des lignes */ /* remarque : 0 extraction réussie, 1 erreur , 2 plus de données à extraire */ While @@sqlstatus != 2 begin Fetch nom_curseur into liste_fetch_target. End Exemple DECLARE authors_cursor CURSOR FOR SELECT au_lname, au_fname FROM authors OPEN authors_cursor FETCH NEXT FROM authors_cursor WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM authors_cursor END Bancquart Page 11 sur 11 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 CLOSE authors_cursor DEALLOCATE authors_cursor Procédure stockées. C'est un ensemble d'instructions SQL stockées dans une BD et éxécutées sous un nom. - Elles sont pré-compilée. - Plus rapide que les mêmes commandes lancées en batch. - Réduisent le trafic sur le réseau. - Assurent l'homogénéité, sécurité de la BD - Développement d'applications modulaires. - Réduisent le risque d'erreur. - Automatisent les transactions complexes. Create proc nom_procedure [ @param1 type1, …..] As Instruction SQL Return Pour exécuter une procédure Exec nom_procedure "P1" Possible d'être appelée par (batch, Procédure stockée, trigger, prog dblib, client tiers) Pour visualiser le code sp_helptext nom_procedure Pour avoir la liste des procédure stockées. Select * from sysobjects where type = "P" Pour modifier une PS il faut détruire l'ancienne (drop) et recréer la nouvelle (create) Possibilité de passer des paramètres. Transactions imbriquées. Une transaction peut appeler une PS qui elle même créée une transcation, etc…. Limite à 16 niveaux (elles sont récursives) Pensez à rendre vos procédures consistantes et conviviales. Impossible de réaliser Pour voir les dépendances d'une procédure sp-depends nom_procedure. Recompilation de procédures create proc ………..; with recompile. Dans ce cas à chaque utilisation le système recompile la procédure. Selon les paramètres transmis, un plan d'exécution différent est requis pour que la requête soit exécutée efficacement. Exec cherche "toto" , "tata" cas ou on utilise l'index clusterisé. Exec cherche "bibi", "zorro" dans ce scan de toutes les lignes. Dans ce cas il utile de recompiler à chaque utilisation. Possibilité d'exécuter une PS à distance Exec nom_serveur.nom_base.propriétaire.nom_procédure Exemple USE pubs /$ cooenction à la base */ Bancquart Page 12 sur 12 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 /* destruction si elle existe déja, toutes modifications obligera à la détruire et à la recréer.*/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'au_info_all' AND type = 'P') DROP PROCEDURE au_info_all GO /* creation */ 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 /* Il ne reste plus qu'à l'exécuter autant de fois que l'on le désire, elle reste en tant qu'objet dans la BD */ au_info_all Procédures du système La BD sybsystemprocs contient des PS utiles permettant d'accéder aux tables systèmes. Elles commencent par sp_ Integrité referentielle Cas des tables liés par des clés primaires et donc étrangères dans les modèles, si une clé primaire est insérée (inserted) elle doit être unique. S'il existe des clés étrangères ne pas autoriser la suppression de la valeur clé primaire. Suppression (deleted) d'une clé primaire alors supprimer les étrangères y faisant référence. Modification d'une clé primaire alors modification de toutes celles y faisant référence. Forme évoluée de règles utilisés 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 Les triggers sont stockées avec les données dans la base. Les triggers sont déclenchés automatiquement par le noyau SQL à chaque intervention sur la table qui les supportent, pas de possibilités de passer outre quelque soit l’utilisateur. Principes : Les triggers sont un type particulier de procédure mémorisée. 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, 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. La suppression d’une table entraîne la destruction de ses triggers Principe de fonctionnement : Deux tables virtuelles sont créées au moment de la MAJ sur la table: INSERTED , DELETED. Elles sont destinées à contenir les lignes de la table sur lesquelles ont été effectuées des opérations. Les tables INSERTED et DELETED peuvent être utilisées par le trigger pour déterminer Bancquart Page 13 sur 13 CPI-BD-Cours-Transac SQL.doc ISAIP-EPID Formation IRIISQL SERVER /Transact-SQL 04/01/03 comment le traitement doit se dérouler. Ce traitement est à écrire par le développeur. 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. Cas de suppression d’une ligne de table (delete) La/les lignes supprimées sont placées dans la table temporaire DELETED et supprimées de la table réelle; la table DELETED et les tables de la base ne peuvent pas avoir de lignes en commun. Cas de création d’une ligne de table (insert) La/les lignes nouvelles sont placées dans la table temporaire INSERTED et dans la table réelle; toutes les lignes de la table INSERTED apparaissent dans la table de la base. Cas de modification d’une ligne de table (update) La/les lignes avant modification sont placées dans la table temporaire DELETED et la/les lignes après modification sont placées dans la table temporaire INSERTED et dans la table réelle CREATION D' UN TRIGGER Un trigger est un objet SQL Server, en conséquence de quoi : Les triggers seront gérés de manière autonome Chaque trigger porte un nom Chaque trigger possède un certain nombre de propriétés. 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. La création d’un trigger peut se faire de manière interactive grâce à l’interface graphique, en utilisant les procédures de SQL Server. Utiliser la procédure create trigger CREATE TRIGGER nom de trigger ON nom de table FOR INSERT AS séquence1 d’ordres SQL FOR UPDATE AS séquence2 d’ordres SQL FOR DELETE AS séquence3 d’ordres SQL CREATE TRIGGER nom de trigger ON nom de table FOR INSERT, UPDATE AS séquence d’ordres SQL 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. LES TRIGGERS EN CASCADE 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 en cascade est fonction du SGBD (16 en SQL Server). Bancquart Page 14 sur 14 CPI-BD-Cours-Transac SQL.doc