2016-03-19 12 views
4

Unten ist die DDL für die Tabelle, die ich erstellen möchte. Ich möchte jedoch, dass das Attribut 'Expertise_breed' von 'Expertise_animal' abgeleitet wird. Zum Beispiel, wenn 'Hund' in 'Expertise_animal' eingegeben wird, möchte ich nicht in der Lage sein, in eine Katzenrasse einzutreten. Wie würde ich das erreichen? Ich arbeite mit SQL Server Management Studio 2012SQL - Wie kann die Dateneingabe eines Attributs in Abhängigkeit von einem anderen Attribut eingeschränkt werden?

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

Und wie möchten Sie Ihren SQL Server lehren, dass 'Pudel' tatsächlich ein' Hund' ist? – Ralph

+2

Sie können Prüfbedingung erstellen – Dejan

+0

Diese Prüfbedingung würde wie eine kleine Datenbank aussehen. –

Antwort

-1

Sie können einen Trigger für Insert erstellen und/oder zu aktualisieren und diese beiden Spalten für jede Zeile vergleichen. Sie können auf die eingefügten Einträge über 'eingefügt' Alias ​​verweisen.

Wenn Sie wissen, welche Zuordnungen erlaubt sind (z. B. Hund x Pudel), können Sie sie in einer Tabelle speichern und mit ihr in der Einfügung zusammenführen, um die falschen herauszufiltern.

+0

Warum der Downvote? –

2

Dies ist eine Beziehung Daten Situation, sollten Sie relationale Tabellen verwenden.

hätte ich drei AnimalClassification - (Inland, wild, andere) AnimalSpecies (Hund, Katze, Ziege) AnimalBreed (Pudel, Beagle) Tierarten einen Fremdschlüssel zu Tier Klassifizierung dh Hund haben würde - Inland Tierrasse würde einen Fremdschlüssel Tier hat Spezies also Beagle - Hund

-1

Theoretisch, was Sie können constraints, eine generische Art und Weise, dies zu tun, die folgenden sein (nicht getestet) mit Tischniveau erreicht werden sollen:

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) 

Während dies Ihnen helfen kann, ist es nicht empfehlenswert, eine solche komplexe Validierung auf Datenbankebene vorzunehmen. Komplexe Validierungen sind (zumindest) in der Business-Schicht Ihrer Anwendung implementiert, die normalerweise innerhalb der Logic tier (in der Regel ASP.NET MVC, WCF-Dienst, Web-Service usw.) liegt (einige Validierungen werden auch in der Präsentationsschicht platziert) Rundreisen Zeitverzögerungen.

Datenbank soll in erster Linie für Datenpersistenz und holen. natürlich einfache Einschränkungen wie FK s, unique Einschränkungen, Spalte Constraints usw. sind willkommen zu vermeiden, da sie als eine gute Sicherheit handeln Netz

Denken Sie auch daran, dass Einschränkungen wie die oben genannten für jede oder UPDATE in der Tabelle ausgelöst werden und die Pe erheblich verschlechtern können rformance für Abfragen mit einer großen Anzahl von Datensätzen.

Verwandte Themen