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

Documents pareils