Éléments fondamentaux de l'architecture de SQL Server Microsoft® SQL Server™ est une base de données relationnelle client/serveur basée sur Structured Query Language (SQL). Chacun de ces terms decrit une partie fondamentale de l'architecture de SQL Server. Base de données Une base de donnée est similaire à un fichier de données en ce qu'il s'agit d'un emplacement de stockage de données. De la même façon qu'un fichier de données, une base de données ne présentent pas directement les informations à un utilisateur; ces derniers exécutent une application qui accède aux données de la base de données et les présentent à l'utilisateur sous un format compréhensible. Les systèmes de base de données sont plus puissants que les fichiers de données. Les données sont beaucoup plus organisées. Dans une base de données bien conçue, il n'y a pas d'ensembles de données dupliqués que l'utilisateur ou l'application aient à mettre à jour en même temps. Les ensembles de données associées sont regroupés dans une seule structure ou enregistrement, et des relations peuvent être définies entre ces structures et ces enregistrements. Pour travailler avec des fichiers de données, une application doit être programmée afin de pouvoir travailler avec la structure spécifique de chaque fichier de données. Au contraire, une base de données contient un catalogue que les applications utilisent pour déterminer comment sont organisées les données. Les applications de base de données génériques utilisent le catalogue pour présenter de façon dynamique aux utilisateurs les données en provenance de différentes bases de données, sans être associées à un format de données spécifique. Généralement, une base de données possède deux constituants: les fichiers contenant la base de données physique et le programme de gestion de base de données (SGBD) que les applications utilisent pour accéder aux données. Le SGBD est responsable du respect de la structure de la base de données, c'est-à-dire : de maintenir les relations entre les données dans la base de données. de s'assurer que les données sont correctement conservées et que les règles définissant les relations entre les données ne sont pas violées. de récupérer toutes les données à partir d'un point de cohérence connu en cas de défaillances du système. Base de données relationnelle Il existe différentes façons d'organiser des données dans une base de données, mais les bases de données relationnelles font partie des plus efficaces. Les systèmes de bases de données relationnelles sont une application au problème de l'organisation efficace des données de la théorie mathématique des ensembles. Dans une base de données relationnelle, les données sont regroupées dans des tables (appelées relations dans la théorie relationnelle). Une table représente une classe d'objets qui sont importants pour une organisation. Par exemple, une entreprise peut avoir une base de données comprenant une table des employés, une autre table pour les clients et une dernière pour ses stocks. Chaque table comporte des colonnes et des lignes (attributs et nuplets dans la théorie relationnelle). Chaque colonne représente un attribut de l'objet dont la table est une représentation. Par exemple, une table Employés se compose typiquement de colonnes pour le nom, le prénom, l'identification de l'employé, le service, l'échelon salarial et l'intitulé de poste. Chaque ligne représente une instance de l'objet dont la table est une représentation. Par exemple, un ligne de la table Employés représente l'employé dont le numéro d'identification est ID 12345. Los de l'organisation des données à l'intérieur de tables, il est possible de trouver de nombreuses façons permettant de définir les tables. La théorie des bases de données relationnelles définit le processus normalisation, qui permet de s'assurer que l'ensemble de tables que vous avez défini organisera efficacement vos données. Client/Serveur Dans un système client/serveur, le serveur est un ordinateur relativement important situé en position centrale qui gère des ressources utilisées par de nombreuses personnes. Quand des personnes ont besoin d'utiliser les ressources, elles se connectent par l'intermédiaire du réseau à partir de leurs ordinateurs, ou clients, au serveur. Exemples de serveurs: Serveurs d'impression Gèrent les imprimantes utilisées par une équipe ou un service. Serveurs de fichiers Stockent de gros fichiers utilisés par une unité ou un service qui utilisent d'importants lecteurs. Serveurs de messagerie électronique Exécutent le système de messagerie électronique d'une société. Dans l'architecture d'une base de données client/serveur, les fichiers de la base de données et le logiciel de SGBD sont installés sur un serveur. Un composant de communications est fourni, permettant aux applications de s'exécuter sur des clients distincts et de communiquer avec le serveur de base de données par l'intermédiaire d'un réseau. Le composant de communications de SQL Server autorise également les communications entre une application qui s'exécute sur le serveur et SQL Server. Les applications de Server sont en général capables de travailler avec plusieurs clients en même temps. SQL Server peut travailler simultanément avec des milliers d'applications clientes. Le serveur possède des caractéristiques lui permettant de prévenir les problèmes logiques susceptibles de survenir si un utilisateur essaie de lire ou de modifier des données en cours d'utilisation par d'autres. Bien que SQL Server ait été conçu pour travailler comme serveur à l'intérieur d'un réseau client/serveur, il est également capable de fonctionner comme base de données isolée directement sur un ordinateur client. L'évolutivité et la facilité d'emploi de SQL Server lui permettent de fonctionner efficacement sur un ordinateur client sans consommer trop de ressources. Langage de requêtes structurées (SQL) Pour travailler sur les données d'une base de données, il faut utiliser un jeu de commandes et d'instructions (langage) défini par le logiciel de SGBD. Les bases de données relationnelles peuvent utiliser plusieurs langages différents, le plus courant est SQL. Les standards pour SQL ont été définis par l'American National Standards Institute (ANSI) et l'International Standards Organization (ISO). La plupart des SGBD modernes prennent en charge au moins le Niceau d'entrée de SQL-92, le dernier standard SQL (publié en 1992). Caractéristiques de SQL Server Microsoft® SQL Server™ met en œuvre un ensemble de caractéristiques qui présentent les avantages suivants : Facilité d'installation, de déploiement, et d'utilisation. SQL Server possède un ensemble d'outils de développement et d'administration qui améliorent votre capacité à installer, déployer, gérer et utiliser SQL Server à travers plusieurs sites. Evolutivité Le même moteur de base de données peut être utilisé sur plusieurs plates-formes, allant des ordinateurs portables qui exécutent Microsoft Windows® 95/98 jusqu'aux gros serveurs multiprocesseurs fonctionnant sous Microsoft Windows NT®, Édition Entreprise. Data warehousing SQL Server possède des outils permettant d'extraire et d'analyser des données synthétiques en vue de leur traitement analytique en ligne (OLAP). SQL Server possède aussi des outils pour concevoir visuellement des bases de données et analyser les données à l'aide de questions posées en anglais. Intégration du système avec d'autres logiciels de serveur SQL Server intègre la messagerie électronique, Internet et Windows. Architecture Client/Serveur Microsoft® SQL Server™ est conçu pour fonctionner de manière efficace dans divers environnements : En tant que système de bases de données client/serveur à deux ou plusieurs niveaux. En tant que système de bases de données de bureau. Systèmes de bases de données client/serveur Les systèmes client/serveur sont conçus de telle manière que la base de données puisse résider dans un ordinateur central qui occupe alors la fonction de serveur et puisse être partagée par plusieurs utilisateurs. Les utilisateurs accèdent au serveur par l'intermédiaire d'une application client ou serveur : Dans un système client/serveur à deux niveaux, les utilisateurs exécutent une application en local sur leur ordinateur (lequel est le poste client) qui les connecte, en passant par le réseau, au serveur sur lequel s'exécute SQL Server. L'application client, qui exécute la logique d'entreprise et le code permettant d'afficher le résultat à l'utilisateur, est également appelée client lourd. Dans un système client/serveur à plusieurs niveaux, la logique de l'application client s'exécute en deux endroits : Le client léger s'exécute en local sur l'ordinateur de l'utilisateur et vise à afficher les résultats à l'utilisateur. La logique d'entreprise se retrouve dans les applications serveur qui s'exécutent sur un serveur. Les clients légers demandent des fonctions à l'application serveur, qui est elle-même une application parallélisée capable de fonctionner simultanément avec plusieurs utilisateurs. C'est l'application serveur qui ouvre les connexions au serveur de base de données, et elle peut s'exécuter sur le même serveur que la base de données. Elle peut également se connecter, en passant par le réseau, à un autre serveur qui fonctionne en tant que serveur de base de données. Ceci est le scénario typique d'une application Internet. Par exemple, une application serveur peut s'exécuter sous Microsoft Internet Information Services (IIS) et servir des milliers de clients légers qui s'exécutent sur Internet ou sur un intranet. L'application serveur utilise un ensemble de connexions pour communiquer avec une copie de SQL Server. SQL Server peut s'installer sur le même ordinateur que IIS ou sur un autre serveur du réseau. Le fait d'avoir des données stockées et gérées à un endroit centralisé présente plusieurs avantages : Chaque élément de données est stocké en un point central, accessible à tous les utilisateurs. Les différentes copies des données ne sont pas stockées sur les postes clients, ce qui élimine, par exemple, les problèmes avec les utilisateurs qui ont à s'assurer qu'ils travaillent bien avec les mêmes informations. Les règles relatives à l'entreprise et à la sécurité doivent être définies une fois pour toutes sur le serveur, et contraignent tous les utilisateurs au même niveau et de manière identique. Ceci est possible dans une base de données en utilisant les contraintes, les procédures stockées et les déclencheurs. C'est également possible dans une application serveur. Un serveur de base de données relationnelle permet d'optimiser le trafic sur le réseau, en ne renvoyant que les données nécessaires à chaque application. Par exemple, si une application utilisant un fichier de serveur a besoin d'afficher la liste des noms de tous les vendeurs (Sales Representative) de l'Orégon (OR), elle doit normalement récupérer le fichier des employés (employee) dans sa totalité. Au contraire, si cette application communique avec un serveur de base de données relationnelle, il lui suffit d'exécuter la commande suivante : SELECT first_name, last_name FROM employees WHERE emp_title = 'Sales Representative' AND emp_state = 'OR' La base de données relationnelle renverra uniquement les noms de tous les vendeurs de l'Oregon, et non l'intégralité des informations relatives à tous les employés. Les coûts matériels peuvent ainsi être minimisés. Étant donné que les données ne sont pas stockées sur chaque poste client, il n'est pas nécessaire pour l'utilisateur, de réserver de l'espace disque pour le stockage de ces données. Il n'est donc pas nécessaire pour les postes clients de disposer de capacité de traitement pour gérer les données en local. Quant au serveur, il est dispensé de mobiliser sa puissance de traitement pour afficher les données. Le serveur peut être configuré en vue d'optimiser les capacités d'E/S du disque afin de rechercher les données, tandis que les postes clients peuvent en revanche être configurés en vue d'optimiser les opérations de mise en forme et d'affichage des données récupérées sur le serveur. Le serveur doit être stocké dans un endroit relativement bien sécurisé et être équipé en périphériques tels qu'un onduleur, qui est plus économique qu'un dispositif général de protection de tous les postes clients. Les tâches de maintenance telles que la sauvegarde et la restauration des données, sont donc plus simples, puisqu'elles ne concernent que le serveur central. Au sein d'un important système client/serveur, des milliers d'utilisateurs peuvent être connectés simultanément au serveur qui exécute SQL Server. SQL Server est muni d'un dispositif complet de protection pour ce type d'environnements avec, par exemple, des sécurités évitant des problèmes tels que le fait d'avoir plusieurs utilisateurs qui essayent simultanément de mettre à jour les mêmes données. SQL Server est capable d'allouer efficacement à plusieurs utilisateurs les ressources disponibles telles que la mémoire, la largeur de la bande réseau ou encore les E/S disque. Des applications SQL Server peuvent être exécutées sur l'ordinateur même où s'exécute SQL Server. L'application se connecte à SQL Server en utilisant les composants de communication interprocessus (IPC) de Windows (telle que la mémoire partagée), au lieu de passer par un réseau. Cela permet à SQL Server de pouvoir être utilisé avec de petits systèmes sur lesquels, par exemple, une application donnée a besoin de stocker ses données localement. Systèmes de bases de données de bureau Efficace en tant que serveur, SQL Server peut également être utilisé avec des applications qui ont besoin d'utiliser une base de données autonome stockée localement sur le poste client. SQL Server peut, de façon dynamique, se configurer lui-même, afin de s'exécuter avec les ressources disponibles sur un poste client, sans qu'il soit pour cela besoin de dédier à chaque poste client un administrateur de base de données. Les fournisseurs d'applications peuvent également intégrer SQL Server en tant que composant de stockage de données dans leurs applications. Lorsque les clients utilisent des bases de données locales SQL Server, une copie du moteur de base de données SQL Server s'exécute sur le poste client et gère toutes les bases de données SQL Server qui y sont installées. Les applications se connectent au moteur de base de données de la même manière que lorsqu'elles se connectent, en passant par le réseau, à un moteur de base de données qui s'exécute sur un serveur distant. Architecture de base de données Les données de Microsoft® SQL Server™ sont stockées dans des bases de données et sont organisées en composants logiques visibles par les utilisateurs. Une base de données est également implémentée physiquement sous forme de deux fichiers ou plus sur disque. Lorsque vous utilisez une base de données, vous commencez par manipuler les composants logiques tels que les tables, les vues, les procédures et les utilisateurs. L'implémentation physique des fichiers est en grande partie transparente. Cette tâche revient par défaut à l'administrateur de la base de données. Chaque installation SQL Server possède plusieurs bases de données. SQL Server dispose de quatre bases de données système (master, model, tempdb et msdb), chaque installation SQL Server possédant une ou plusieurs bases de données utilisateur. Certaines entreprises ne disposent que d'une base de données utilisateur unique qui regroupe toutes leurs données. D'autres, en revanche, possèdent des bases de données propres à une division de leur entreprise et, parfois, d'une base de données réservée à une seule application. Ainsi, une entreprise peut disposer d'une base de données spécifique aux ventes, aux fiches de paie, à une application de gestion de la documentation, etc. Il arrive aussi qu'une application fasse appel à une ou plusieurs bases de données. Il n'est pas nécessaire d'exécuter plusieurs copies de SQL Server pour permettre à plusieurs utilisateurs d'accéder aux bases de données qui sont installées sur le serveur. SQL Server est capable de prendre en charge des centaines d'utilisateurs travaillant simultanément sur plusieurs bases de données d'un même site. Celles-ci sont accessibles à tous les utilisateurs qui se connectent au serveur, à condition que ces derniers disposent des autorisations d'accès nécessaires. Lorsque vous vous connectez à SQL Server, la connexion est associée à une base de données spécifique appelée la base de données en cours. En principe, il s'agit de la base de données par défaut définie par l'administrateur système, bien que vous puissiez en spécifier une autre grâce aux options de connexion proposées dans les API de la base de données. Vous pouvez passer d'une base de données à une autre à l'aide de l'instruction Transact-SQL USE nom_base_de_données ou utiliser une fonction d'API modifiant le contexte de la base de données en cours. La version 7.0 de SQL Server vous permet de détacher des bases de données d'un serveur, de les réattacher à un autre serveur ou au serveur d'origine. Si vous disposez d'un fichier de base de données SQL Server, vous pouvez indiquer à SQL Server, au moment de la connexion, que vous souhaitez attacher ce fichier à une base de données spécifique. Composants de la base de données logique Les données d'une base de données Microsoft® SQL Server™ sont organisées en plusieurs objets, visibles par un utilisateur lorsqu'il se connecte à la base de données. Dans SQL Server, les composants suivants sont définis en tant qu'objets : Les contraintes Les tables Les valeurs par défaut Les déclencheurs Les types de données définis par Les index l'utilisateur Les clés Les vues Les procédures stockées Types de données et structures de table Toutes les données des bases de données Microsoft® SQL Server™ sont contenues dans des objets appelés tables, chacune d'entre elles représentant un type d'objet significatif pour les utilisateurs. Dans la base de données d'une école, par exemple, il est logique de trouver des tables relatives au cours, au professeur et à l'élève. Les tables SQL Server sont constituées de deux composants principaux : Colonnes Chaque colonne représente un attribut quelconque de l'objet modélisé par la table, comme une table de pièces détachées comportant des colonnes réservées à l'ID, à la couleur et à l'épaisseur. Lignes Chaque ligne représente une seule occurrence de l'objet modélisé par la table. Par exemple, la table de pièces détachées pourrait comporter une ligne pour chaque pièce vendue par l'entreprise. Étant donné que chaque colonne représente un attribut d'un objet, les données de chaque occurrence de la colonne sont similaires. L'une des propriétés d'une colonne s'appelle le type de données. SQL Server possède plusieurs types de données de base : binary bit char datetime decimal float image int money nchar ntext nvarchar numeric real smalldatetime smallint smallmoney sysname text timestamp tinyint varbinary varchar uniqueidentifier Les utilisateurs peuvent également créer leurs propres types de données, par exemple : -- Create a birthday data type that allows nulls. EXEC sp_addtype birthday, datetime, 'NULL' GO -- Create a table using the new data type. CREATE TABLE employee (emp_id char(5), emp_first_name char(30), emp_last_name char(40), emp_birthday birthday) Un type de données défini par l'utilisateur facilite la lisibilité de la structure de la table et garantit que les colonnes contenant des catégories de données similaires possèdent le même type de données de base. Un domaine désigne l'ensemble de toutes les valeurs autorisées dans une colonne. Il comprend le type de données et les valeurs autorisées dans les colonnes. Ainsi, un domaine couleur de pièce comprendrait le type de données char(6) ainsi que les chaînes de caractères autorisées dans la colonne telles que Rouge, Bleu, Vert, Jaune, Marron, Noir, Blanc, Vert foncé, Gris et Argent. Les valeurs de domaine peuvent être imposées par l'intermédiaire de mécanismes comme les contraintes CHECK et les déclencheurs. Les colonnes peuvent accepter ou rejeter les valeurs NULL. NULL est un concept spécifique aux bases de données désignant une valeur de type inconnu, contrairement au blanc ou au zéro (0), qui représentent respectivement un caractère et un nombre reconnus. NULL se distingue également d'une chaîne de longueur nulle. Si une définition de colonne contient la clause NOT NULL, cela signifie que vous ne pouvez pas insérer de ligne ayant la valeur NULL. Si la définition de colonne comporte uniquement le mot clé NULL, vous pouvez insérer des valeurs NULL. L'autorisation des valeurs NULL dans une colonne peut augmenter la complexité de toutes les comparaisons logiques utilisant cette colonne. Selon la norme SQL-92, toute comparaison effectuée à l'aide d'une valeur NULL ne prend pas la valeur TRUE ou FALSE mais la valeur UNKNOWN. Cela se traduit donc par l'introduction de trois opérateurs de comparaison logiques pouvant entraîner des problèmes de gestion. SQL Server stocke les données définissant la configuration du serveur et toutes ses tables dans un ensemble de tables spécifique appelé tables système. Il est impossible de les consulter ou de les modifier directement. Seul SQL Server peut les référencer en réponse aux commandes d'administration lancées par les utilisateurs. Les tables système pouvant changer d'une version à l'autre, il s'avère parfois nécessaire de réécrire les applications qui les référencent directement avant de passer à une nouvelle version de SQL Server utilisant une autre version des tables système. SQL Server prend en charge les tables temporaires dont le nom commence par le signe dièse (#). Si une table temporaire n'est pas supprimée lors de la déconnexion de l'utilisateur, elle l'est automatiquement par SQL Server. Les tables temporaires ne sont pas stockées dans la base de données en cours, mais dans la base de données système tempdb. Il en existe deux types : Les tables temporaires locales possèdent un seul signe dièse (#) au début de leur nom. Elles ne sont visibles que de la connexion qui les a créées. Les tables temporaires globales possèdent un double signe dièse (##) au début de leur nom. Elles sont visibles par toutes les connexions. Si elles ne sont pas supprimées explicitement avant la fin de la connexion qui les a créées, elles le sont dès que toutes les autres tâches ont cessé de les référencer. Aucune nouvelle tâche ne peut référencer une table temporaire globale une fois la déconnexion effectuée. Par ailleurs, l'association entre une tâche et une table étant toujours supprimée une fois l'instruction en cours terminée, les tables temporaires globales sont en général supprimées peu après la fin de la connexion qui les a créées. Les utilisateurs manipulent les données dans les tables à l'aide des instructions du langage de manipulation des données (DML) SQL : -- Get a list of all employees named Smith: SELECT emp_first_name, emp_last_name FROM employee WHERE emp_last_name = 'Smith' -- Delete an employee who quit: DELETE employee WHERE emp_id = 'OP123' -- Add a new employee: INSERT INTO employee VALUES ( 'OP456', 'Dean', 'Straight', '01/01/1960') -- Change an employee name: UPDATE employee SET emp_last_name = 'Smith' WHERE emp_id = 'OP456' Vues SQL Une vue peut être représentée comme une table virtuelle ou une requête stockée. Les données accessibles par l'intermédiaire d'une vue ne sont pas stockées dans la base de données sous forme d'objet distinct. C'est une instruction SELECT qui est stockée, le jeu de résultats de cette instruction constituant la table virtuelle renvoyée par la vue. Un utilisateur peut l'utiliser en référençant le nom de la vue dans les instructions Transact-SQL de la même façon qu'une table. Une vue permet d'exécuter tout ou une partie des fonctions suivantes : Limiter les droits d'accès d'un utilisateur à certaines lignes d'une table. Vous pouvez, par exemple, accorder à un employé l'autorisation de visualiser uniquement les lignes concernant ses heures de travail dans la table de suivi de la main-d'œuvre. Limiter les droits d'accès d'un utilisateur à certaines colonnes. Vous pouvez, par exemple accorder aux employés qui ne travaillent pas dans le service de la paye, l'autorisation en lecture des colonnes Nom, Bureau, Téléphone professionnel et Division de la table des employés, mais leur refuser l'accès aux informations d'ordre privé ou financier. Relier les colonnes issues de plusieurs tables de façon à leur conférer l'aspect d'une table unique. Rassembler des informations au lieu de les détailler. Vous pouvez, par exemple, présenter le total d'une colonne, ou encore sa valeur minimale ou maximale. Pour créer une vue, il convient de définir l'instruction SELECT qui récupère les données à présenter dans la vue. Les tables de données référencées par l'instruction SELECT sont appelées les tables de base de la vue. titleview dans la base de données pubs est un exemple de vue qui sélectionne les données issues de trois tables de base, pour présenter une table virtuelle des données les plus fréquentes. CREATE VIEW titleview AS SELECT title, au_ord, au_lname, price, ytd_sales, pub_id FROM authors AS a JOIN titleauthor AS ta ON (a.au_id = ta.au_id) JOIN titles AS t ON (t.title_id = ta.title_id) Vous pouvez ensuite référencer titleview dans les instructions de la même façon qu'une table. SELECT * FROM titleview Une vue peut en référencer une autre. Ainsi, titleview présente des informations utiles aux directeurs mais, en général, une société n'a besoin que des chiffres cumulés jusqu'à ce jour dans ses états financiers annuels ou trimestriels. Il est possible de construire une vue sélectionnant toutes les colonnes de titleview à l'exception de au_ord et de ytd_sales. Les clients peuvent s'en servir pour obtenir les listes des catalogues disponibles sans accéder aux informations financières : CREATE VIEW Cust_titleview AS SELECT title, au_lname, price, pub_id FROM titleview Les vues de Microsoft® SQL Server™ peuvent être mises à jour (elles peuvent être la cible des instructions UPDATE, DELETE ou INSERT) tant que la modification n'affecte que l'une des tables de base référencées par la vue. -- Increase the prices for publisher '0736' by 10%. UPDATE titleview SET price = price * 1.10 WHERE pub_id = '0736' GO Procédures stockées SQL Une procédure stockée est un groupe d'instructions Transact-SQL compilées en un plan d'exécution unique. Les procédures stockées de Microsoft® SQL Server™ renvoient les données de quatre façons différentes : Les paramètres en sortie, qui renvoient des données (telles qu'un entier ou un caractère) ou une variable de curseur (les curseurs sont des jeux de résultats pouvant être extraits une ligne à la fois). Les codes renvoyés, qui sont toujours un entier. Un jeu de résultats pour chaque instruction SELECT contenue dans la procédure stockée ou toute autre procédure stockée appelée par la procédure stockée. Un curseur global qui peut être référencé en dehors de la procédure stockée. Les procédures stockées contribuent à mettre en œuvre une logique cohérente dans les applications. Les instructions SQL et la logique nécessaires à l'exécution d'une tâche fréquente peuvent être créées, codées et testées une seule fois dans une procédure stockée. Il suffit ensuite à chaque application devant effectuer la tâche d'exécuter la procédure stockée. Le codage de la logique de gestion en une seule procédure offre aussi un point de contrôle unique permettant de vérifier que les règles d'entreprise sont bien respectées. Les procédures stockées peuvent également améliorer les performances. De nombreuses tâches sont mises en œuvre sous forme de séquences d'instructions SQL. La logique conditionnelle appliquée aux résultats des premières instructions SQL détermine les instructions suivantes à exécuter. Si ces instructions SQL et la logique conditionnelle sont écrites dans une procédure stockée, elles deviennent partie intégrante d'un plan d'exécution unique sur le serveur. Les résultats n'ont pas besoin d'être renvoyés au client pour que la logique conditionnelle soit appliquée, car tout le travail est réalisé sur le serveur. Dans cet exemple, l'instruction IF montre l'imbrication d'une logique conditionnelle dans une procédure afin d'empêcher l'envoi d'un ensemble de résultats à l'application : IF (@QuantityOrdered < (SELECT QuantityOnHand FROM Inventory WHERE PartID = @PartOrdered) ) BEGIN -- SQL statements to update tables and process order. END ELSE BEGIN -- SELECT statement to retrieve the IDs of alternate items -- to suggest as replacements to the customer. END Les applications n'ont pas besoin de transmettre l'intégralité des instructions SQL dans la procédure : elles n'ont à transmettre que les instructions EXECUTE ou CALL qui contiennent le nom de la procédure et les valeurs des paramètres. Les procédures stockées évitent aussi aux utilisateurs d'avoir à connaître les détails des tables de la base de données. Si un ensemble de procédures stockées prend en charge toutes les fonctions de gestion nécessaires aux utilisateurs, ceux-ci n'ont pas besoin d'accéder directement aux tables ; il leur suffit d'exécuter les procédures stockées qui modélisent les processus avec lesquels ils ont l'habitude de travailler. Les procédures stockées du système SQL Server évitant aux utilisateurs d'accéder aux tables système en sont un exemple. SQL Server comprend un ensemble de procédures stockées système dont les noms commencent en général par sp_. Ces procédures prennent en charge toutes les tâches administratives nécessaires à l'exécution d'un système SQL Server. Vous pouvez administrer un système SQL Server à l'aide des instructions Transact-SQL associées à l'administration (telles que CREATE TABLE) ou des procédures stockées du système, sans jamais avoir à mettre à jour directement les tables système. Dans les versions antérieures de SQL Server, les procédures stockées constituaient une façon de précompiler partiellement un plan d'exécution. Au moment où la procédure stockée était créée, un plan d'exécution partiellement compilé était enregistré dans une table système. L'exécution d'une procédure stockée était plus efficace que celle d'une instruction SQL, car SQL Server n'avait pas besoin de compiler complètement un plan d'exécution ; il n'avait qu'à finir d'optimiser le plan stocké pour la procédure. De même, la compilation complète d'un plan d'exécution pour la procédure stockée a été conservée dans le cache de procédure de SQL Server, ce qui signifie que les exécutions ultérieures de la procédure stockée pourront utiliser le plan d'exécution précompilé. SQL Server version 7.0 apporte de nombreuses modifications au traitement des instructions ce qui permet d'étendre à toutes les instructions SQL la plupart des améliorations des performances dues aux procédures stockées. Au moment de la création de procédures stockées, SQL Server 7.0 n'enregistre pas un plan partiellement compilé. Une procédure stockée est compilée au moment de son exécution comme n'importe laquelle des instructions Transact-SQL. SQL Server 7.0 conserve les plans d'exécution de toutes les instructions SQL dans le cache de procédure, et pas uniquement les plans d'exécution des procédures stockées. Un algorithme performant compare les nouvelles instructions Transact-SQL à celles des plans d'exécution existants. Si une correspondance est trouvée, SQL Server 7.0 réutilise le plan d'exécution. Ceci réduit le bénéfice de performances relatif de la précompilation des procédures stockées en étendant la réutilisation des plans d'exécution à toutes les instructions SQL. SQL Server 7.0 offre une nouvelle alternative au traitement des instructions SQL. Pour plus d'information, voir Architecture du processeur de requêtes SQL Server prend également en charge les procédures stockées temporaires qui, à l'instar des tables temporaires, sont automatiquement supprimées à la déconnexion. Les procédures stockées temporaires sont stockées dans tempdb et elles sont utiles en cas de connexion avec les versions antérieures de SQL Server. Vous pouvez les utiliser lorsqu'une application construit des instructions Transact-SQL dynamiques exécutées plusieurs fois. Au lieu d'avoir à recompiler à chaque fois ces instructions, vous pouvez créer une procédure stockée temporaire qui est compilée à la première exécution, puis exécuter le plan précompilé plusieurs fois. Cependant, une utilisation intensive des procédures stockées temporaires, peut conduire à un encombrement des tables système dans tempdb. Les deux fonctions suivantes de SQL Server 7.0 réduisent l'utilisation des procédures stockées temporaires : SQL Server 7.0 est capable de réutiliser les plans d'exécution issus d'instructions SQL précédentes. Ceci est particulièrement efficace en cas de couplage avec l'utilisation de la nouvelle procédure stockée système sp_executesql. SQL Server 7.0 gère le modèle de préparation/exécution d'OLE DB et d'ODBC en mode natif sans utiliser de procédure stockée. Pour plus d'information sur les alternatives à l'utilisation des procédures stockées temporaires, voir Mise en mémoire cache et réutilisation du plan d'exécution Cette simple procédure stockée illustre les trois manières selon lesquelles les procédures stockées renvoient des données : 1. La procédure lance d'abord une instruction SELECT qui renvoie un jeu de résultats regroupant l'activité de commandes des magasins dans la table sales. 2. Elle lance ensuite une instruction SELECT qui complète un paramètre en sortie. 3. Enfin, elle comporte une instruction RETURN accompagnée d'une instruction SELECT qui renvoie un entier. Les codes renvoyés permettent en général de retransmettre des informations de contrôle d'erreur. Comme cette procédure s'exécute sans erreur, elle renvoie une autre valeur pour montrer comment les codes renvoyés sont complétés. USE Northwind GO DROP PROCEDURE OrderSummary GO CREATE PROCEDURE OrderSummary @MaxQuantity INT OUTPUT AS -- SELECT to return a result set summarizing -- employee sales. SELECT Ord.EmployeeID, SummSales = SUM(OrDet.UnitPrice * OrDet.Quantity) FROM Orders AS Ord JOIN [Order Details] AS OrDet ON (Ord.OrderID = OrDet.OrderID) GROUP BY Ord.EmployeeID ORDER BY Ord.EmployeeID -- SELECT to fill the output parameter with the -- maximum quantity from Order Details. SELECT @MaxQuantity = MAX(Quantity) FROM [Order Details] -- Return the number of all items ordered. RETURN (SELECT SUM(Quantity) FROM [Order Details]) GO -- Test the stored procedure. -- DECLARE variables to hold the return code -- and output parameter. DECLARE @OrderSum INT DECLARE @LargestOrder INT -- Execute the procedure, which returns -- the result set from the first SELECT. EXEC @OrderSum = OrderSummary @MaxQuantity = @LargestOrder OUTPUT -- Use the return code and output parameter. PRINT 'The size of the largest single order was: ' + CONVERT(CHAR(6), @LargestOrder) PRINT 'The sum of the quantities ordered was: ' + CONVERT(CHAR(6), @OrderSum) GO Le résultat généré par l'exécution de cet exemple est le suivant : EmployeeID SummSales ----------- -------------------------1 202,143.71 2 177,749.26 3 213,051.30 4 250,187.45 5 75,567.75 6 78,198.10 7 141,295.99 8 133,301.03 9 82,964.00 The size of the largest single order was: 130 The sum of the quantities ordered was: 51317 Contraintes, règles, valeurs par défaut et déclencheurs Les colonnes des tables possèdent des propriétés autres que le type et la taille des données. Ces propriétés constituent une composante importante du mécanisme assurant l'intégrité des données d'une base de données. L'intégrité des données se rapporte à chaque occurrence d'une colonne possédant une valeur de donnée correcte. Par valeur de donnée correcte, on entend un type de données et un domaine valides. L'intégrité référentielle indique que les relations existant entre les tables sont correctes. Les données d'une table doivent pointer uniquement sur les lignes existantes d'une autre table, pas sur des lignes inexistantes. Les objets utilisés pour mettre à jour les deux types d'intégrité sont : Les contraintes Les règles Les valeurs par défaut Les déclencheurs Contraintes Les contraintes sont un moyen permettant à Microsoft® SQL Server™ d'assurer automatiquement l'intégrité d'une base de données. Les contraintes définissent des règles relatives aux valeurs autorisées dans les colonnes et elles constituent le mécanisme standard de mise en application de l'intégrité plutôt que les déclencheurs, les règles ou les valeurs par défaut. L'optimiseur de requêtes s'en sert aussi pour améliorer les performances liées à l'évaluation de la sélectivité, au calcul des coûts et à la réécriture des requêtes. Il existe cinq catégories de contraintes. NOT NULL indique que la colonne n'accepte pas les valeurs NULL. Les contraintes CHECK assurent l'intégrité du domaine en limitant les valeurs placées dans une colonne. Une contrainte CHECK indique une condition de recherche de type booléen (valeurs TRUE ou FALSE) appliquée à toutes les valeurs saisies dans la colonne ; toutes les valeurs ne prenant pas la valeur TRUE sont rejetées. Vous pouvez spécifier plusieurs contraintes CHECK pour chaque colonne. Cet exemple montre la création d'une contrainte nommée, chk_id, qui vérifie par la suite le domaine de la clé primaire en veillant à ce que seuls les nombres compris dans la plage spécifiée soient saisis pour la clé. CREATE TABLE cust_sample ( cust_id int PRIMARY KEY, cust_name char(50), cust_address char(50), cust_credit_limit money, CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 ) ) Les contraintes UNIQUE garantissent le caractère unique des valeurs dans un ensemble de colonnes. Dans une contrainte UNIQUE, deux lignes d'une table ne peuvent pas avoir la même valeur non NULL dans les colonnes. Les clés primaires mettent aussi en application l'unicité des valeurs, mais elles n'autorisent pas les valeurs NULL. Une contrainte UNIQUE est préférable à un index unique. Les contraintes PRIMARY KEY identifient une colonne ou un ensemble de colonnes dont les valeurs identifient de manière unique chaque ligne d'une table. Deux lignes d'une table ne peuvent pas avoir la même valeur de clé primaire. Dans une clé primaire, il est impossible d'entrer une valeur NULL dans une colonne. NULL est une valeur spécifique aux bases de données qui représente une valeur inconnue, distincte d'un blanc ou de la valeur 0. L'utilisation d'une petite colonne d'entiers comme clé primaire est recommandée. Chaque table devrait avoir une clé primaire. Une table peut être constituée de plusieurs combinaisons de colonnes identifiant de manière unique les lignes d'une table ; chaque combinaison est une clé candidate. L'administrateur de la base de données sélectionne l'une des clés candidates pour en faire la clé primaire. Dans la table part_sample, par exemple, part_nmbr et part_name pourraient être des clés candidates, mais seule part_nmbr est choisie comme clé primaire. CREATE TABLE part_sample (part_nmbr int PRIMARY KEY, part_name char(30), part_weight decimal(6,2), part_color char(15) ) Les contraintes FOREIGN KEY identifient les relations entre les tables. Une clé étrangère dans une table pointe sur une clé candidate dans une autre table. Vous ne pouvez pas insérer de ligne ayant une valeur de clé étrangère (à l'exception de NULL) s'il n'existe pas de clé candidate possédant cette valeur. Vous ne pouvez pas supprimer de ligne dans la table référencée s'il existe une valeur de clé étrangère référençant cette clé candidate. Dans l'exemple ci-dessous, la table order_part crée une clé étrangère référençant la table part_sample définie précédemment. En principe, order_part devrait avoir aussi une clé étrangère correspondante dans une table de commandes, mais il s'agit ici d'un exemple simple. CREATE TABLE order_part (order_nmbr int, part_nmbr int FOREIGN KEY REFERENCES part_sample(part_nmbr), qty_ordered int) GO Les contraintes peuvent porter sur une colonne ou une table : Une contrainte de colonne est déclarée comme faisant partie de la définition de la colonne et ne s'applique qu'à celle-ci (c'est le cas des contraintes des exemples précédents). Une contrainte de table est déclarée indépendamment de la définition de la colonne et s'applique à plusieurs colonnes d'une table. Les contraintes de table sont obligatoires lorsque plusieurs colonnes doivent être incluses dans une contrainte. Si, par exemple, une table dispose de deux colonnes ou plus dans la clé primaire, vous devez utiliser une contrainte de table pour inclure les deux colonnes dans la clé primaire. Prenons l'exemple d'une table enregistrant les événements survenant sur une machine dans une usine. Supposons que des événements de plusieurs types puissent se produire au même moment, mais qu'aucun des deux événements survenant au même moment ne soit du même type. Pour reproduire ce cas de figure dans une table, vous pouvez inclure les colonnes type et time dans une clé primaire à deux colonnes. CREATE TABLE factory_process (event_type int, event_time datetime, event_site char(50), event_desc char(1024), CONSTRAINT event_key PRIMARY KEY (event_type, event_time) ) Règles Les règles sont une fonction de compatibilité ascendante exécutant certaines des fonctions effectuées par les contraintes CHECK. Les contraintes CHECK sont le moyen standard et le plus efficace de limiter les valeurs d'une colonne. Elles sont également plus concises que les règles. Il ne peut y avoir qu'une seule règle appliquée à une colonne, contrairement aux contraintes CHECK qui peuvent être multiples. Les contraintes CHECK font partie intégrante de l'instruction CREATE TABLE, alors que les règles sont créées sous forme d'objets séparés, liés ensuite à la colonne. Cet exemple crée une règle exécutant la même fonction que la contrainte CHECK citée en exemple dans la rubrique précédente. La contrainte CHECK est la méthode recommandée dans Microsoft® SQL Server™. CREATE RULE id_chk AS @id BETWEEN 0 and 10000 GO CREATE TABLE cust_sample ( cust_id int PRIMARY KEY, cust_name char(50), cust_address char(50), cust_credit_limit money, ) GO sp_bindrule id_chk, 'cust_sample.cust_id' GO Valeurs par défaut Les valeurs par défaut sont utilisées dans une colonne si vous n'en indiquez pas d'autres lors de l'insertion d'une ligne. Il peut s'agir de toute valeur prenant la valeur d'une constante : Constante Fonction intégrée Expression mathématique Il existe deux moyens d'appliquer les valeurs par défaut : Créer une définition par défaut à l'aide du mot clé DEFAULT dans l'instruction CREATE TABLE pour affecter une expression de constante comme valeur par défaut à une colonne. Cette méthode est recommandée. Elle est également la plus concise. Créer un objet par défaut à l'aide de l'instruction CREATE DEFAULT et le lier aux colonnes à l'aide de la procédure stockée du système sp_bindefault. Il s'agit d'une fonction de compatibilité ascendante. Cet exemple crée une table à l'aide de chaque type de valeur par défaut. Il crée ensuite un objet par défaut pour affecter une valeur par défaut à une colonne et lie cet objet à la colonne. Puis il réalise un test d'insertion sans indiquer de valeur pour les colonnes comportant des valeurs par défaut et extrait la ligne de test pour vérifier que les valeurs par défaut ont bien été appliquées. USE pubs GO CREATE TABLE test_defaults (keycol smallint, process_id smallint DEFAULT @@SPID, --Preferred default definition date_ins datetime DEFAULT getdate(), --Preferred default definition mathcol smallint DEFAULT 10 * 2, --Preferred default definition char1 char(3), char2 char(3) DEFAULT 'xyz') --Preferred default definition GO /* Illustration only, use DEFAULT definitions instead.*/ CREATE DEFAULT abc_const AS 'abc' GO sp_bindefault abc_const, 'test_defaults.char1' GO INSERT INTO test_defaults(keycol) VALUES (1) GO SELECT * FROM test_defaults GO Le résultat de cet exemple est le suivant : Default bound to column. (1 row(s) affected) keycol process_id date_ins mathcol char1 char2 ------ ---------- --------------------------- ------- ----- ---1 7 Oct 16 1997 8:34PM 20 abc xyz (1 row(s) affected) Déclencheurs Les déclencheurs constituent une catégorie particulière de procédures stockées ; ils sont définis pour s'exécuter automatiquement lors du lancement sur une table d'une instruction UPDATE, INSERT ou DELETE. Ils constituent un outil puissant qui permet à chaque site de mettre automatiquement en application ses règles de gestion quand des données sont modifiées. Les déclencheurs peuvent étendre la logique de contrôle d'intégrité des contraintes, des valeurs par défaut et des règles de Microsoft® SQL Server™, même si l'utilisation des contraintes et des valeurs par défaut est préférable à chaque fois, bien que ces dernières fournissent toutes les fonctionnalités nécessaires. Les tables peuvent comporter plusieurs déclencheurs. L'instruction CREATE TRIGGER peut être définie avec les clauses FOR UPDATE, FOR INSERT ou FOR DELETE pour affecter un déclencheur à une catégorie spécifique d'actions de modification des données. Lorsque la clause FOR UPDATE est spécifiée, la clause IF UPDATE (nom_colonne) affecte un déclencheur aux mises à jour portant sur une colonne spécifique. SQL Server permet d'attribuer plusieurs déclencheurs à une action spécifique (UPDATE, INSERT ou DELETE) dans une table unique. Les déclencheurs permettent aussi d'automatiser certaines tâches dans une entreprise. Dans un système de gestion de stock, les déclencheurs de mise à jour peuvent détecter le seuil de réapprovisionnement et générer automatiquement une commande au fournisseur. Dans une base de données enregistrant les procédés de fabrication d'une usine, les déclencheurs peuvent prévenir les opérateurs par radiomessagerie ou par courrier électronique qu'un procédé dépasse les limites de sécurité autorisées. Le déclencheur suivant génère un courrier électronique à chaque fois qu'un nouveau titre est ajouté à la base de données pubs. CREATE TRIGGER reminder ON titles FOR INSERT AS EXEC master..xp_sendmail 'MaryM', 'New title, mention in the next report to distributors.' Les déclencheurs contiennent des instructions Transact-SQL, à l'instar des procédures stockées. Ils renvoient l'ensemble des résultats généré par toute instruction SELECT au déclencheur. Il est déconseillé d'inclure des instructions SELECT dans les déclencheurs, à l'exception de celles qui ne remplissent que des paramètres, car les utilisateurs ne s'attendent pas à voir apparaître des jeux de résultats à la suite d'une instruction UPDATE, INSERT ou DELETE. Les déclencheurs s'exécutent une fois terminée l'instruction qui les a lancés. Si l'instruction échoue du fait d'une erreur, telle qu'une violation de contrainte ou une erreur de syntaxe, le déclencheur n'est pas exécuté. Bases de données et données système Les systèmes Microsoft® SQL Server™ possèdent quatre bases de données système : master La base de données master enregistre l'intégralité des informations système relatives à un système SQL Server. Tous les comptes de connexion et les paramètres de configuration du système y sont consignés. La base de données master enregistre l'existence de toutes les autres bases de données et l'emplacement des fichiers primaires contenant les informations d'initialisation des bases de données utilisateur. Elle enregistre les informations d'initialisation de SQL Server, de sorte qu'une sauvegarde récente de la base est toujours disponible. tempdb tempdb contient toutes les tables et les procédures stockées temporaires. Elle répond également à tout autre besoin de stockage temporaire tel que les tables de travail générées par SQL Server. tempdb est une ressource globale ; les tables temporaires et les procédures stockées de tous les utilisateurs connectés au système y sont stockées. tempdb est recréée à chaque fois que SQL Server est lancé de façon que le système démarre avec une copie propre de la base de données. Les tables et les procédures stockées temporaires sont automatiquement supprimées à la déconnexion et aucune connexion n'est active à l'arrêt du système. De ce fait, tempdb ne contient jamais rien qui doive être sauvegardé d'une session SQL Server à une autre. tempdb se développe automatiquement au fur et à mesure des besoins. À chaque redémarrage du système, tempdb reprend sa taille par défaut. Vous pouvez éviter la surchage liée à l'extension automatique de tempdb en utilisant l'instruction ALTER TABLE pour augmenter la taille de tempdb. model La base de données model fait office de modèle pour toutes les bases de données créées sur un système. Lors de l'émission d'une instruction CREATE DATABASE, la première partie de la nouvelle base de données est créée par copie du contenu de la base de données model, le reste étant constitué de pages vides. La base de données tempdb étant créée à chaque démarrage de SQL Server, la base de données model doit toujours exister sur un système SQL Server. msdb La base de données msdb permet à SQL Server Agent de planifier les alertes et les travaux et d'enregistrer les opérateurs. Dans la version 7.0 de SQL Server, chaque base de données (base de données système comprises), possède son propre jeu de fichiers qui n'est pas partagé avec les autres bases de données. L'emplacement par défaut de ces fichiers est le répertoire C:\Mssql7\Data : Fichier de base de Nom de fichier Taille par défaut, données physique. installation standard données primaires de master.mdf 7.5 Mo master journal de master mastlog.ldf 1.0 Mo données primaires de tempdb.mdf 8.0 Mo tempdb journal de tempdb templog.ldf 0.5 Mo données primaires de model.mdf 0,75 Mo model journal de model modellog.ldf 0,75 Mo données primaires de msdbdata.mdf 3.5 Mo msdb journal de msdb msdblog.ldf 0,75 Mo Dans les versions précédentes de SQL Server, les bases de données système master et model se trouvaient dans un fichier unique qui portait le nom de périphérique maître. Les deux premiers Mo affectés à la base de données tempdb se trouvaient aussi dans le ce fichier périphérique maître et, parfois, dans la base de données exemple pubs. Cette concentration de bases de données sur un seul et même fichier entraînait parfois des problèmes de place dans les bases de données master et model. Dans SQL Server 7.0, toutes ces bases de données possèdent leur propre jeu de fichiers qui peuvent ainsi se développer de façon indépendante. Chaque base de données SQL Server contient des tables système enregistrant les données nécessaires aux composants SQL Server. Le bon fonctionnement de SQL Server dépendant de l'intégrité des informations présentes dans les tables système, Microsoft ne prend pas directement en charge les utilisateurs mettant à jour les informations des tables système. Microsoft fournit un jeu complet d'outils administratifs permettant aux utilisateurs d'administrer complètement leur système et de gérer tous les utilisateurs et les objets d'une base de données. Les utilisateurs peuvent utiliser les outils d'administration tels que SQL Server Enterprise Manager. Les développeurs peuvent recourir à l'API SQL-DMO pour intégrer les fonctionnalités d'administration complètes de SQL Server dans leurs applications. Ceux qui développent des scripts Transact-SQL et des procédures stockées peuvent utiliser les procédures stockées système et les instructions DDL Transact-SQL pour gérer toutes les fonctions administratives. Une autre fonctionnalité importante de SQL-DMO, des procédures stockées système et des instructions DDL consiste à protéger les applications des modifications effectuées dans les tables système. Microsoft a parfois besoin de modifier les tables système des nouvelles versions de SQL Server pour prendre en charge les nouvelles fonctionnalités ajoutées à la version. Les applications qui lancent des instructions SELECT référençant directement les tables système dépendent souvent de l'ancien format des tables système. Certains sites peuvent être dans l'impossibilité de migrer vers la nouvelle version de SQL Server tant qu'ils n'ont pas réécrit les applications effectuant des sélections à partir de ces tables système. Microsoft prend en compte les procédures stockées système, les interfaces de publication DDL et SQL-DMO et fait en sorte de maintenir la compatibilité descendante de ces interfaces. Microsoft ne prend pas en charge les déclencheurs définis sur les tables système car ils pourraient perturber le bon fonctionnement du système. Un autre outil très important d'interrogation du catalogue SQL Server est le jeu de vues du schéma d'informations (Information Schema Views). Ces vues sont compatibles avec le schéma d'informations défini dans la norme SQL-92. Elles fournissent aux applications un composant de recherche du catalogue SQL basé sur des standards.