SQL – Comment limiter la saisie de données d'un atsortingbut en fonction d'un autre atsortingbut?

Voici le DDL pour la table que je veux créer. Cependant, je veux que l'atsortingbut 'Expertise_breed' soit dérivé de 'Expertise_animal'. Par exemple, si 'Chien' est entré dans 'Expertise_animal', je ne veux pas pouvoir entrer dans une race de chat. Comment pourrais-je y parvenir? Je travaille avec SQL Server Management Studio 2012

CREATE TABLE tExpertise ( Expertise_ID int NOT NULL PRIMARY KEY, --EG Data '001' Expertise_type varchar(8) NOT NULL, --EG Data 'Domestic' Expertise_animal varchar(30) NOT NULL, --EG Data 'Dog' Expertise_breed varchar(30) NOT NULL --EG Data 'Poodle' ) 

Ceci est une situation de données de relation, vous devez utiliser des tables relationnelles.

J'aurais trois classification animale – (domestique, sauvage, autre) AnimalSpecies (chien, chat, chèvre) AnimalBreed (Caniche, Beagle) Les espèces animales auraient une key étrangère à la classification des animaux ie chien – domestique La race animale aurait une key étrangère à l'animal espèces c'est-à-dire Beagle – chien

Vous pouvez créer un triggersur lors de l'insertion et / ou de la mise à jour et comparer ces deux colonnes pour chaque ligne. Vous pouvez vous référer aux inputs insérées via l'alias 'inséré'.

Si vous savez quels sont les mappages autorisés (par ex. Chien x caniche), vous pouvez les stocker dans une table et les joindre dans l'insert pour filterr les mauvaises.

Théoriquement, ce que vous voulez peut être réalisé en utilisant des contraintes de niveau table, une façon générique de faire ceci étant la suivante ( non testée ):

 CREATE FUNCTION dbo.validateExpertise( @expertise_type varchar(8), @Expertise_animal varchar(30), @Expertise_breed varchar(30) ) RETURNS BIT AS BEGIN IF (@Expertise_animal == 'dog' AND @Expertise_breed != 'dog') RETURN 0; -- other validations can come here RETURN 1; END GO -- add a table level constraint -- WITH NOCHECK can be used to not check existing data ALTER TABLE detailTable ADD CONSTRAINT chkExpertise CHECK (dbo.validateExpertise(expertise_type, Expertise_animal, Expertise_breed) = 1) 

Bien que cela puisse vous aider, il n'est pas recommandé de mettre une telle validation complexe au niveau de la database. Les validations complexes sont destinées à être (au less) implémentées dans la couche de gestion de votre application, généralement au niveau Logic (généralement ASP.NET MVC, service WCF, service Web, etc.) (certaines validations sont également placées dans la présentation). couche pour éviter les retards de voyages aller-return.

La database est principalement destinée à la persistance et à la récupération des données. Bien sûr, les contraintes simples telles que les FK , unique contraintes unique contraintes au niveau des colonnes, etc. sont les bienvenues car elles constituent un bon filet de security.

De plus, gardez à l'esprit que des contraintes comme celle mentionnée ci-dessus se triggersront pour chaque INSERT ou UPDATE de la table et pourraient dégrader sérieusement les performances pour les requêtes impliquant un grand nombre d'loggings.