Programmation Transact SQL



Documents pareils
Historisation des données

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

MS SQL Express 2005 Sauvegarde des données

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Configurer la supervision pour une base MS SQL Server Viadéis Services

Attaques applicatives

Cours Bases de données 2ème année IUT

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

CREATION WEB DYNAMIQUE

Création et Gestion des tables

Bases de données avancées

SQL Historique

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Le Langage De Description De Données(LDD)

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Les déclencheurs. Version 1.0. Grégory CASANOVA

Devoir Data WareHouse

BTS/CGO P10 SYSTEME INFORMATION Année

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Exercices sur SQL server 2000

Introduction aux Bases de Données 2004/2005

1/ Présentation de SQL Server :

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Olivier Mondet

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

ADO.NET. Ado.net propose deux modes d'accès, le mode connecté et le mode déconnecté.

Bases de données relationnelles

Gestion de base de données

Introduction à JDBC. Accès aux bases de données en Java

Langage SQL : créer et interroger une base

Mysql. Les requêtes préparées Prepared statements

SQL Server Cyril Gruau. 11 février 2003

TP Contraintes - Triggers

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

SQL Server 2000, Analysis Services et DTS

Table des matières 1 DISASTER RECOVERY SAUVEGARDER RESTAURER BASE DE DONNÉS "SUSPECT"... 28

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Pour valider les pré-requis nécessaires, avant d'aborder le TP, répondez aux questions ciaprès

Corrigé de l'atelier pratique du module 5 : Analyse de SQL Server

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Modélisation et Gestion des bases de données avec mysql workbench

Bases de Données relationnelles et leurs systèmes de Gestion

Introduction au PL/SQL Oracle. Alexandre Meslé

Support de Cours REQUÊTES TRANSACT-SQL DANS MICROSOFT SQL SERVER Stéphane N GUESSAN Groupe Pigier Abidjan Version 1.

Installation FollowMe Q server

BASES DE DONNEES TP POSTGRESQL

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Le langage procédural PL-PGSQL

Corrigés détaillés des exercices

1. Base de données SQLite

Java DataBaseConnectivity

Présentation Windows Azure Hadoop Big Data - BI

Les BASES de DONNEES dans WampServer

PDO : PHP Data Object 1/13

Auto-évaluation Oracle: cours de base

FileMaker 13. Guide de référence SQL

I. MySQL : Serveur et SGBD

A QUOI SERVENT LES BASES DE DONNÉES?

Mysql avec EasyPhp. 1 er mars 2006

TP3 : Creation de tables 1 seance

Sybase Adaptive Server Enterprise 15

PHP 5. La base de données MySql. A. Belaïd 1

A QUOI SERVENT LES BASES DE DONNÉES?

Stockage du fichier dans une table mysql:

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Formateur : Caroline CHAILLET Cours 4740A - Implémentation d'une base de données Microsoft SQL Server /134

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Optimisations des SGBDR. Étude de cas : MySQL

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Les bases fondamentales du langage Transact SQL

Résumé S Q L. Auteur: Alexandre PATIN Edition: 22 février alexandre.patin@free.fr URL :

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

AGRÉGATION «ÉCONOMIE ET GESTION»

Les Utilisateurs dans SharePoint

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

SQL Server ressource SOMMAIRE

Corrigé de l'atelier pratique du module 3 : Récupération d'urgence

PROJET 1 : BASE DE DONNÉES REPARTIES

Compte-rendu de projet de Système de gestion de base de données

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

Les bases de données

Gestion de stock pour un magasin

Notes de cours : bases de données distribuées et repliquées

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Intégrité sémantique dans les bases de données relationnelles

Cours SQL. Base du langage SQL et des bases de données

APIs de table pour SQL Server

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

Encryptions, compression et partitionnement des données

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Transcription:

Programmation Transact SQL Procédure Ecrire une procédure qui permet de rendre un film emprunté. Cette procédure admet en paramètre le numéro d'exemplaire du film emprunté et se charge de compléter la table des détails afin d'enregistrer le retour à la date et heure courante. La procédure porte le nom de restituer et le paramètre sera nommé numeroexemplaire. La procédure peut être créée de la façon suivante: CREATE PROCEDURE restituer(@numeroexemplaire int) AS UPDATE Magasin.Details SET retoureffectifle=getdate() WHERE retoureffectifle is null AND exemplaire=@numeroexemplaire; Fonction qui retourne une valeur scalaire Ecrire une fonction qui accepte en paramètre un numéro de film et qui retourne le nombre d'exemplaires de ce film. Cette fonction portera le nom de nombreexemplaires et le paramètre sera nommé numerofilm. Exemple d'utilisation de la fonction: La fonction peut être créée de la façon suivante CREATE FUNCTION nombreexemplaires (@numerofilm int) RETURNS int AS DECLARE @nombre int; http://www.apsql.com 1

SELECT @nombre=count(*) FROM Magasin.Exemplaires WHERE film=@numerofilm; RETURN @nombre; Fonction qui retourne une table Ecrire une fonction qui retourne la liste de tous les exemplaires qui devrait être rendu et qui ne le sont toujours pas. En face du numéro de l'exemplaire, il est nécessaire de trouver le titre du film, la date d'emprunt ainsi que les coordonnées de l'emprunteur (nom, prénom, téléphone) du film emprunté. La fonction portera le nom exemplairesenretard. Exemple d'utilisation de la fonction: Note: La ligne n 3 concernant l'exemplaire n 1 à était ajoutée sur la fiche n 4 afin de pouvoir tester la fonction en cours de création Cette fonction peut être définie à l'aide du script suivant: CREATE FUNCTION exemplairesenretard() RETURNS @detailexemplaire TABLE (numeroexemplaire int, titre nvarchar(80), dateemprunt datetime, nomemprunteur nvarchar(50), prenomemprunteur nvarchar(50), telephoneemprunteur char(14))as INSERT INTO @detailexemplaire(numeroexemplaire, titre, dateemprunt, nomemprunteur, prenomemprunteur, telephoneemprunteur) SELECT md.exemplaire, f.titre, mf.creele, nom, prenom, telephone FROM Magasin.Details md INNER JOIN Magasin.Exemplaires e ON e.numero=md.exemplaire INNER JOIN Films f ON e.film=f.numero http://www.apsql.com 2

INNER JOIN Magasin.Fiches mf ON md.fiche=mf.numero INNER JOIN Magasin.Clients mc ON mf.client=mc.numero WHERE retoureffectifle is null AND retourprevule<getdate(); RETURN; Etant donné que cette fonction ne contient qu'une seule instruction, il est possible de la définir de la façon suivante: CREATE FUNCTION exemplairesenretard() RETURNS TABLE AS RETURN SELECT numeroexemplaire=md.exemplaire, f.titre, dateemprunt=mf.creele, nomemprunteur=nom, prenomemprunteur=prenom, telephoneemprunteur=telephone FROM Magasin.Details md INNER JOIN Magasin.Exemplaires e ON e.numero=md.exemplaire INNER JOIN Films f ON e.film=f.numero INNER JOIN Magasin.Fiches mf ON md.fiche=mf.numero INNER JOIN Magasin.Clients mc ON mf.client=mc.numero WHERE retoureffectifle is null AND retourprevule<getdate(); Trigger Calculer automatiquement le montant dû pour chaque film emprunté Ajouter la colonne montant au niveau de la table Details et valoriser cette colonne lorsque l exemplaire est effectivement rendu. Compte tenu du fait que cette colonne va stocker une valeur monétaire c'est le type money qui sera choisi. La modification de la structure de la table Magasin.Details peut être réalisée à l'aide du script suivant: ALTER TABLE Magasin.Details ADD montant money null; Par la suite le déclencheur de base de données doit être défini sur la table Magasin.Details et doit s'exécuter lors de la valorisation de la colonne retoureffectifle. Cette valorisation à lieu au cours de la mise à jour de la ligne c'est dire par l'exécution de l'instruction UPDATE. CREATE TRIGGER Magasin.DetailsMontant ON Magasin.Details AFTER UPDATE AS -- S'assurer que la mise à jour porte sur la date de retour IF (UPDATE (retoureffectifle)) -- Curseur pour traiter toutes les lignes concernées par la mise à jour http://www.apsql.com 3

DECLARE capres CURSOR FOR SELECT numero, fiche,exemplaire, retoureffectifle FROM inserted; DECLARE @numero INT; DECLARE @fiche INT; DECLARE @exemplaire INT; DECLARE @retoureffectifle DATETIME; DECLARE @valeurinitialeretour DATETIME; OPEN capres; -- Obtenir les informations sur la première ligne FETCH NEXT FROM capres INTO @numero, @fiche, @exemplaire, @retoureffectifle; WHILE (@@FETCH_STATUS=0) -- interdire la modification de la date de retour si elle est déjà valorisée SELECT @valeurinitialeretour=retoureffectifle FROM deleted WHERE numero=@numero AND fiche=@fiche; IF (@valeurinitialeretour is not null ) RAISERROR ('Le changement de date de retour est interdit',16,1); -- Calcul du montant de la ligne DECLARE @montant MONEY; SELECT @montant=(prixlocationjour*datediff(day,creele,@retoureffectifle)) FROM Magasin.Fiches f, Magasin.Exemplaires e INNER JOIN Films on Films.numero=e.film WHERE e.numero=@exemplaire AND f.numero=@fiche; UPDATE Magasin.Details SET montant=@montant WHERE numero=@numero AND fiche=@fiche; -- Traiter la ligne suivante de la table inserted FETCH NEXT FROM capres INTO @numero, @fiche, @exemplaire, @retoureffectifle; CLOSE capres; DEALLOCATE capres; Est-il possible d'utiliser les colonnes calculées? SQL Server propose une fonctionnalité intéressante qui est celle des colonnes calculées. Lors de la définition de la colonne dans la table, il est possible de préciser la formule de calcul à utiliser. Toutefois les colonnes qui servent de base au calcul doivent être présentent dans la même table que la colonne calculée ce qui n'est pas le cas ici. Donc il n'est pas possible d'utiliser une colonne calculée. Garantir que le montant payé est bien égal au montant dû Toujours à l'aide d'un trigger de base de données mettez en place un contrôle automatique pour garantir que le montant payé (qui est enregistré au niveau de la fiche) correspond bien au montant dû. Il est bien sûr possible de régler une fiche uniquement si la totalité des films empruntés ont été restitués. Avant d'écrire le trigger de base de données sur la table Magasin.Fiches, il est préférable d'écrire la fonction Magasin.Rendue qui accepte en paramètre un numéro de fiche et qui retourne la valeur 1 si toute les films présents dans la fiche sont restitué et 0 sinon. http://www.apsql.com 4

CREATE FUNCTION Magasin.Rendue(@numeroFiche int) RETURNS tinyint AS DECLARE @retour tinyint; DECLARE @nombre int; SELECT @nombre=count(*) FROM Magasin.Details WHERE fiche=@numerofiche AND retoureffectifle is null; IF (@nombre=0) SET @retour=1; ELSE SET @retour=0; RETURN @retour Ensuite la fonction Magasin.MontantFiche qui accepte en paramètre le numéro d'une fiche et qui retourne le montant à payer est définie: CREATE FUNCTION Magasin.MontantFiche(@numeroFiche int) RETURNS money AS -- Toutes les films ont ils bien restitués? IF (Magasin.rendue(@numeroFiche)!=1) -- Tous les films ne sont pas encrore rendus RETURN 0; -- Calculer le montant de la fiche DECLARE @montant money; SELECT @montant=sum(montant) FROM Magasin.Details WHERE fiche=@numerofiche; RETURN @montant; Il est maintenant possible d'écrire le déclencheur. Ce déclencheur sera associé à l'instruction UPDATE sur la table Magasin.Fiches. CREATE TRIGGER Magasin.tr_upd_fiches ON Magasin.Fiches FOR UPDATE AS IF UPDATE(montantPaye) -- Parcourir toutes les lignes mises à jour DECLARE cnouveau CURSOR FOR SELECT numero, montantpaye FROM inserted; DECLARE @numero int; DECLARE @montantpaye money; OPEN cnouveau; -- Travailler avec la première ligne FETCH cnouveau INTO @numero,@montantpaye; -- Tant qu'il reste des lignes WHILE(@@FETCH_STATUS=0) IF (@montantpaye>magasin.montantfiche(@numero)) RAISERROR ('Montant trop important',15,1); http://www.apsql.com 5

-- Passer à l'enregistrement suivant FETCH cnouveau INTO @numero,@montantpaye; CLOSE cnouveau; DEALLOCATE cnouveau; http://www.apsql.com 6