Création de votre modèle de données physique

ALTER TABLE OrderItem FK__OrderItem_SalesOrder ADD CONSTRAINT FOREIGN KEY (SalesOrderID) RÉFÉRENCES SalesOrder (SalesOrderID) ON DELETE CASCADE
  

Pourquoi est-ce communiqué appelle une contrainte d'intégrité référentielle déclarative? Parce qu'il déclare le comportement de l'intégrité référentielle de la table dans le cadre de la définition de la table elle-même, plutôt que de mettre en oeuvre un tel comportement constitue une pièce distincte de code informatique exécutable. Nous pause maintenant à cette contrainte DRI et de regarder ce que chaque phrase signifie, en commençant par le texte suivant :

ALTER TABLE OrderItem ADD CONSTRAINT FK__OrderItem_SalesOrder

Le membre de phrase précédent modifie la définition de la table enfant OrderItem d'ajouter la contrainte objet nommé FK__OrderItem_SalesOrder. Cet objet contient les trois lignes restantes de code, qui constituent les instructions précises de la contrainte, comme suit:

FOREIGN KEY (SalesOrderID) RÉFÉRENCES SalesOrder (SalesOrderID)

Cette phrase est la «viande et pommes de terre» de la contrainte DRI. Il crée la restriction entre les OrderItem.SalesOrderID clé étrangère et la SalesOrder clé primaire. SalesOrderID de sorte que, pour chaque valeur stockée dans OrderItem.SalesOrderID, une valeur égale doit être stocké dans SalesOrder.SalesOrderID avec laquelle OrderItem.SalesOrderID ne peut égaler. Si toute autre valeur est tenté dans OrderItem.SalesOrderID, la base de données renvoie une erreur et la tentative échoue. Enfin, la dernière ligne de la contrainte DRI est comme suit:

ON DELETE CASCADE

Cette ligne indique à la base de données d'abord supprimer toutes les lignes OrderItem liés à une ligne SalesOrder qui est sur le point d'être supprimé. Sans la clause ON DELETE CASCADE dans cette contrainte DRI, en essayant de supprimer une ligne SalesOrder avec les lignes liées OrderItem jetterait une erreur, et aucune modification ne serait apportée au contenu ou l'autre table. Les quatre premières lignes du code de contrainte sont standard DRI syntaxe approuvées par le la plupart des plates-formes de base de données. Certaines plate-formes de base de données, tels que SQL Server 2000 et Oracle 9i, à soutenir le ON DELETE CASCADE extension à la syntaxe de base DRI pour faciliter ces suppressions en cascade. Pour les plates-formes de base de données qui ne supportent pas les suppressions en cascade dans les contraintes DRI, la suppression en cascade comportement doit être mis en œuvre en utilisant une feuille de code qui s'exécute automatiquement chaque fois qu'un utilisateur tente de supprimer une ligne SalesOrder. Un tel morceau d'exécuter automatiquement le code est appelé un déclencheur. Bien que nous discuter de manière approfondie déclenche plus tard, nous devons couvrir l'essentiel de ce qu'ils sont et comment ils travaillent ici afin que vous puissiez le contraste et les comparer à des contraintes DRI. Tout d'abord, pourquoi sont-ils appelés déclencheurs? La réponse est que l'exécution de l'un est «déclenchée» par un événement de base de données (INSERT, UPDATE ou DELETE). Un déclencheur est attaché à une table spécifique et est chargé d'exécuter automatiquement dès que l'un ou plusieurs événements base de données spécifique a lieu à cette table. Vous pouvez placer n'importe quel code SQL que vous voulez dans un déclencheur, y compris le code qui modifie le contenu des autres tables. Prenons, par exemple, l'alinéa suivant:

ON DELETE CASCADE

Si elle est appliquée comme un déclencheur, la clause précédente devient le code suivant:

CREATE TRIGGER ON tD_SalesOrder SalesOrder POUR SUPPRIMER AS BEGIN DECLARE @ Rows int SELECT @ Rows = @ @ rowcount IF @ Rows = 0 RETURN DELETE OrderItem de CH OrderItem, supprimées si ch.SalesOrderID = deleted.SalesOrderID FIN

Maintenant, pour briser ce qui se passe dans ce code. Tout d'abord, commencer par l'en-tête de déclenchement. Cet en-tête à la fois crée le déclencheur et l'attache à une table spécifique et spécifie également le ou les événements que les incendies, comme suit:

CREATE TRIGGER ON tD_SalesOrder SalesOrder POUR SUPPRIMER AS

En d'autres termes, vous allez créer un déclencheur sur la table SalesOrder nommé tD_SalesOrder, et vous le chargeant d'exécuter à chaque fois qu'un événement se produit DELETE sur la table SalesOrder. So far, so good. Regardez maintenant le corps de la gâchette de la partie qui exécute effectivement, comme suit:

BEGIN DECLARE @ rows int SELECT @ Rows = @ @ rowcount IF @ Rows = 0 RETURN

Vous commencez le bloc de code avec Begin et puis tout de suite déclarer une variable locale de type Integer nommé @ Rows. Cette variable contient le nombre de lignes dans la table SalesOrder touchés par l'événement SUPPR. La variable globale @ @ nombre de lignes est contrôlé par le serveur de base de données, il contient toujours le nombre de lignes affectées par le tableau le plus récemment modifié par le code en cours d'exécution, qui dans ce cas est la table SalesOrder. Alors SELECT @ Rows = @ @ places rowcount le nombre de lignes supprimées de la table SalesOrder dans la variable locale que vous venez déclaré. Si le nombre de lignes affectées est égal à zéro, le code du déclenchement des sorties grâce à l'aide de l'instruction RETURN, et rien ne se passe plus loin. Si ce test RETOUR n'existe pas dans le code de déclenchement, le reste du code de déclenchement s'exécute, et vous ne voulez pas que cela arrive parce que vous seriez l'exécution du code qui ne devrait déclenché si il ya des lignes connexes de l'enfant. Immédiat à la partie de la gâchette qui effectue la suppression en cascade, comme suit:

DELETE OrderItem de CH OrderItem, supprimées si ch.SalesOrderID = deleted.SalesOrderID FIN

Cette dimension relationnelle Suppression supprime ces lignes dans la table OrderItem qui sont liées à toutes les lignes du pseudotable Supprimé: en somme, toutes les lignes OrderItem liés aux lignes SalesOrder supprimé. Enfin, vous fermez le corps de l'élément déclencheur en utilisant END. Déclencheurs ont très différentes capacités sur les plateformes de bases de données. Le déclencheur que nous venons de discuter, par exemple, fonctionne sur la plate-forme SQL Server 2000, qui définit un événement au niveau des états-ce qui signifie que ce déclencheur incendies une fois pour chaque instruction DELETE exécutées sur la table, peu importe combien de lignes sont affectées par cette déclaration. Par comparaison, Oracle déclencheurs peuvent fonctionner soit au niveau de l'instruction, comme dans SQL Server, ou au niveau de la ligne, tels que le code de déclenchement exécute une fois pour chaque ligne individuelle qui est affecté par la déclaration. Une autre distinction entre les plateformes de données c'est quand ils peuvent le feu se déclenche. SQL Server incendies déclenche après l'événement a lieu et toutes les valeurs sont modifiées par l'instruction (mais avant ils se sont engagés sur le disque), Oracle vous permet de définir un déclencheur à exécuter avant ou après l'événement a lieu. D'autres distinctions existent également. Alors, quand pensez-vous mettre en œuvre l'intégrité référentielle en utilisant des contraintes DRI et quand comptez-vous utiliser les triggers? Eh bien, une contrainte DRI est presque toujours plus rapide à exécuter que l'opération équivalente en œuvre dans un déclencheur, et ils sont certainement plus simple de code, mais vous mai ont parfois besoin d'une logique plus complexe à être associées, et pour cela, vous devez utiliser des déclencheurs.

Beaucoup de fois que vous voulez fournir automatiquement des valeurs par défaut de lignes insérées dans une table, par exemple, la date et l'heure actuelle d'une vente, ou une valeur d'état qui représente quelque point de départ dans un processus d'affaires. Ce comportement est mis en œuvre à l'aide de valeurs par défaut sont définies par défaut sur des colonnes de table spécifiques, et ils le disent votre base de données: "Si cette colonne n'est pas inclus dans l'instruction INSERT pour ce tableau, allez-y et automatiquement saisir cette valeur par défaut. Si l'instruction INSERT ne comprend cette colonne, utilisez quelle que soit la valeur a été fourni pour cela. "Voici comment une déclaration par défaut regarde dans la définition de table:

CREATE TABLE SalesOrder (SalesOrderID int IDENTITY (1,1), CustomerNumber varchar (12) NULL, SaleDate datetime DEFAULT GetDate () NOT NULL,  CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED (SalesOrderID))

Vous remarquerez tout au long de cet article que nous portions parfois gras de code. Il s'agit d'un mécanisme simple mais efficace pour vous aider à «voir la forêt pour les arbres», comme on discuter d'un sujet. Par exemple, mettant en évidence l'expression par défaut dans un bloc de code tout en discutant par défaut vous aide à acquérir rapidement la partie la plus applicables du code sans être distrait par le reste lors des discussions. Cette déclaration place automatiquement par défaut le résultat de GetDate SQL Server () de la fonction la date et l'heure actuelle, dans la colonne SaleDate aussi longtemps que la colonne SaleDate n'est pas une partie de l'instruction INSERT. Si la colonne SaleDate fait partie de l'instruction INSERT, la valeur fournie par la déclaration qui sera utilisée.

un article présenté par Linda Hastings


Disclaimer:Notre site n'est pas responsable du contenu de cet article. Webarticles est une ressource d'information gratuite.
Important: Cet article «Création de votre modèle de données physique» a été traduit par un logiciel automatique. Nous nous sentons désolés pour les fautes d'orthographe que mai ont eu lieu. Nous vous remercions de votre compréhension.


Online: 522 users browsing the articles directory