TSQL-Fremdschlüssel in Sichten?
Ich habe eine SQL-Server-2008-Datenbank und ein schema, das verwendet foreign key-Einschränkungen erzwingen der referenziellen Integrität. Funktioniert wie vorgesehen. Jetzt erstellt der Benutzer sichten auf den original-Tabellen zu arbeiten, um auf Teilmengen von Daten nur. Mein problem ist, dass das filtern bestimmter Datensätze in Tabellen, in anderen aber nicht verletzen wird die foreign key-Einschränkungen.
Stellen Sie sich die zwei Tabellen "eins" und "zwei".". "" enthält nur eine id-Spalte mit den Werten 1,2,3. "Zwei" Referenzen "eins". Jetzt können Sie Ansichten erstellen, die auf beide Tabellen. Die Ansicht für die Tabelle "zwei" nicht-filter-alles, während die anzeigen für die Tabelle "eins" löscht alle Zeilen außer der ersten. Sie werden am Ende mit Einträgen in die zweite Sicht, die point nirgendwo.
Gibt es eine Möglichkeit, dies zu vermeiden? Können Sie Fremdschlüssel-constraints zwischen den Ansichten?
Einige Klarstellungen in Reaktion auf einige der Kommentare:
Ich bin mir bewusst, dass die zugrunde liegenden Randbedingungen sicherstellen der Integrität der Daten auch beim einfügen über die Ansichten. Mein problem liegt bei den Aussagen verbrauchen die Ansichten. Diese Aussagen wurden mit den original-Tabellen im Hinterkopf und übernehmen bestimmte Verknüpfungen nicht scheitern. Diese Annahme ist immer dann gültig, wenn die Arbeit mit den Tabellen - aber die Aussicht auf potenziell brechen.
Aufnahme - /Prüfung alle Einschränkungen, die beim erstellen der views in den ersten Platz annyoing aufgrund der großen Anzahl von verweisen auf Tabellen. Also ich hatte gehofft, zu vermeiden.
InformationsquelleAutor der Frage BuschnicK | 2009-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Peter schon Treffer, aber die beste Lösung ist:
I. e.,
Sicher, syntaktische Zucker für die Vermehrung Filter für Ansichten, die auf einer Tabelle mit Aussicht auf untergeordnete Tabellen, die nützlich sein würde, aber, ach, es ist nicht Teil des SQL-Standards. Das heißt, diese Lösung ist immer noch gut genug -- effizient, überschaubar, wartbar, und garantiert den gewünschten Zustand für den Verzehr code.
InformationsquelleAutor der Antwort richardtallent
Liebe ich Ihre Frage. Es schreit der Vertrautheit mit dem Query-Optimizer, und wie Sie sehen können, dass einige Verknüpfungen sind redundant, wenn Sie keinem Zweck dienen, oder wenn es vereinfachen kann, etwas zu wissen, dass es bei den meisten ein Treffer auf der anderen Seite von einem join.
So, die große Frage ist etwa, ob Sie einen FK gegen den CIX-einer Indizierten Sicht. Und die Antwort ist Nein.
Dies alles funktioniert, bis auf die Letzte Anweisung, die Fehler mit:
Also der Fremdschlüssel mit Bezug auf eine user-Tabelle.
Aber... die nächste Frage ist, ob man könnte die Referenz einen eindeutigen index, der gefiltert, SQL 2008, zu erreichen, um-wie von FK.
Und immer noch die Antwort ist Nein.
Gelungen.
Aber jetzt, wenn ich versuche, eine Tabelle zu erzeugen, die auf die
val
Spalte(Ich hatte gehofft, dass der check-Einschränkung, dass die abgestimmten filter in der gefilterten index könnte helfen das system zu verstehen, dass die FK halten sollte)
Aber ich bekomme eine Fehlermeldung:
Wenn ich drop den gefilterten index, und erstellen Sie eine nicht-gefilterten eindeutige nicht gruppierte index ist, dann kann ich erstellen dbo.thirdtable ohne Probleme.
Also ich befürchte, die Antwort scheint immer noch Nicht.
InformationsquelleAutor der Antwort Rob Farley
Es dauerte einige Zeit, um herauszufinden, die misunderstaning hier-nicht sicher, ob ich noch absolut nachvollziehen, aber hier ist es.
Ich werde ein Beispiel, in der Nähe verkaufen, aber mit einigen Daten -- einfacher für mich, in diesen Begriffen denken.
Also zuerst zwei Tabellen; A = Abteilung B = Mitarbeiter
Nun ich werde werfen einige Daten in
So, ich werd jetzt eine Ansicht erstellen, in der ersten Tabelle zu filtern, einige Abteilungen aus.
Diese gibt
Und pro dein Beispiel, ich werde das hinzufügen einer Ansicht für die zweite Tabelle, die nicht filtern nichts.
Diese gibt
Scheint es mir, dass Sie denken, dass der Mitarbeiter Keine 5, DepartmentID = 3 Punkte nach nirgendwo?
Gut, es weist auf die
Department
TabelleDepartmentID = 3
wie angegeben mit der foreign key. Auch wenn Sie versuchen, join-view auf view nichts gebrochen ist:Gibt
Also nichts gebrochen ist hier die Verbindung einfach nicht finden die passenden Datensätze für
DepartmentID <> 2
Dies ist eigentlich das gleiche wie wenn ich join-Tabellen und dann "einschließen" - filter als in der ersten Ansicht:Kehrt wieder:
In beiden Fällen schließt sich nicht Versagen, Sie einfach tun, wie erwartet.
Jetzt werde ich versuchen zu brechen, die die referenzielle Integrität durch eine Ansicht (es gibt keine DepartmentID= 127)
Ergibt:
Wenn ich versuche zu löschen, eine Abteilung über die Ansicht
Sind die Ergebnisse in:
Also Einschränkungen in den zugrunde liegenden Tabellen gelten weiterhin.
Hoffe, das hilft, aber vielleicht habe ich dein problem missverstanden.
InformationsquelleAutor der Antwort Damir Sudarevic
Wenn Sie versuchen, einfügen, aktualisieren oder löschen von Daten über eine Sicht, die zugrunde liegenden Tabellen-Einschränkungen gelten weiterhin.
InformationsquelleAutor der Antwort Damir Sudarevic
So etwas in Ansicht2 wird wahrscheinlich Ihre beste Wette:
InformationsquelleAutor der Antwort Tom H
Wenn die Rollen über die Tische, so dass Identity-Spalten nicht kollidieren, eine Möglichkeit wäre die Verwendung einer lookup-Tabelle, die auf die verschiedenen Daten-Tabellen von Identität und einer Tabelle verweisen.
Fremdschlüssel auf diese Tabelle würde die Arbeit auf der ganzen Linie für die Referenzierung von Tabellen.
Das würde teuer werden in eine Reihe von Möglichkeiten
Die referenzielle Integrität auf der lookup-Tabelle werden müssten durchgesetzt werden, die Verwendung von Triggern.
Zusätzliche Speicherung der lookup-Tabelle und die Indizierung zusätzlich zu den Daten-Tabellen.
Lesen der Daten würde mit ziemlicher Sicherheit bedeuten, eine Gespeicherte Prozedur oder drei zum ausführen einer gefilterten UNION.
Abfrage-plan Bewertung würde sich auch Entwicklungskosten.
Die Liste geht weiter, aber es könnte einige Szenarien.
InformationsquelleAutor der Antwort WaitForPete
Mit Rob Farley schema:
Musste ich erstellen Sie eine kleine helper-Tabelle (dbo.z), um diese Arbeit zu machen, weil indizierte sichten können nicht self-joins, outer-joins, Unterabfragen, oder abgeleitete Tabellen (und TVCs zählen als abgeleitete Tabellen).
InformationsquelleAutor der Antwort Stupid SQL Tricks
Anderen Ansatz, je nach Ihren Anforderungen, wäre die Verwendung einer gespeicherten Prozedur zurückzugeben zwei recordsets. Sie übergeben es Filterkriterien und es verwendet die Filterkriterien Abfrage, Tabelle 1, und dann diese Ergebnisse können verwendet werden, um filter der Abfrage auf Tabelle 2, so dass es die Ergebnisse sind auch konsistent. Dann kehren Sie beide Ergebnisse.
InformationsquelleAutor der Antwort AaronLS
Konnte man die Bühne in der gefilterten Tabelle 1 Daten zu einem anderen Tisch. Der Inhalt dieses staging-Tabelle sind Ihrer Ansicht 1, und dann bauen Sie anzeigen 2 über eine Verknüpfung der staging-Tabelle und die Tabelle 2. Diese Art der Verarbeitung für die Filterung der Tabelle 1 wird einmal ausgeführt und wiederverwendet werden für beide Ansichten.
Wirklich, was es läuft darauf hinaus, dass view 2 hat keine Ahnung, welche Art der Filterung Sie ausgeführt in Ansicht 1, es sei denn, Sie erzählen Ansicht 2 die Filterkriterien an, oder machen es irgendwie abhängig von den Ergebnissen der Sicht 1, was bedeutet, dass die Emulation die gleiche Filterung, das Auftritt, auf view1.
Einschränkungen nicht ausführen jeder Art von filtern, die Sie nur verhindern, dass ungültige Daten, oder die cascade-Taste, ändert und löscht.
InformationsquelleAutor der Antwort AaronLS
Nein, Sie können nicht erstellt Fremdschlüssel, die auf Ansichten.
Selbst wenn man das könnte, würde, wo bleiben Sie? Sie würden immer noch zu erklären, dass die FK nach der Erstellung der Ansicht. Wer würde erklären, FK, du oder der Benutzer? Wenn der user ist anspruchsvoll genug, zu erklären, FK, warum konnte er auch nicht hinzufügen, eine innere Verknüpfung, auf die verwiesen wird? eg:
vs:
Sehe ich nicht, wie die foreign key vereinfachen würde Ihren job.
Alternativ:
Kopieren Sie die Teilmenge der Daten, die in ein anderes schema oder eine Datenbank. Gleiche Tabellen, gleiche Tasten, weniger Daten, schnellere Analyse, weniger Streit.
Wenn Sie eine Teilmenge von alle der Tabellen, die Verwendung einer anderen Datenbank. Wenn Sie nur eine Teilmenge der einige Tabellen, verwenden Sie ein schema in der gleichen Datenbank. Damit ist Ihre neue Tabellen können immer noch Bezug auf die nicht-kopierten Tabellen.
Verwenden Sie dann die vorhandenen Ansichten zu kopieren Sie die Daten über. Jede FK Verstößen wird ein Fehler ausgelöst, und erkennen, welche Ansichten bearbeitet werden müssen. Einen job erstellen und planen Sie täglich, wenn nötig.
InformationsquelleAutor der Antwort Peter Radocchia
Rein Datenintegrität Perspektive (und nichts zu tun mit dem Query-Optimizer), ich hatte mir überlegt, eine Indizierte Sicht. Ich dachte, Sie könnten einen eindeutigen index auf, was könnte gebrochen werden, wenn Sie versuchen, Sie gebrochen zu haben Integrität in Ihren zugrunde liegenden Tabellen.
Aber... ich glaube nicht, dass Sie bekommen können, um die Einschränkungen von indizierten sichten gut genug.
Beispiel:
Sie nicht verwenden können, die outer-joins oder sub-queries. Das macht es sehr schwer, die Zeilen zu suchen, die nicht existieren, in den Blick. Wenn Sie die Aggregate, die Sie nicht verwenden können, so dass schneidet einige Optionen, die Sie verwenden könnte, gibt es auch. Sie kann auch nicht Konstanten, die in einer indizierten Sicht, wenn Sie die Gruppierung (ob oder nicht Sie verwenden Sie eine GROUP BY-Klausel), so können Sie nicht einmal versuchen, einen index über einen Konstanten Bereich, so dass eine zweite Reihe fällt. Sie können nicht verwenden Sie UNION ALL, also die Idee, dass eine Zählung, die brechen einen eindeutigen index, wenn es Sie trifft eine zweite null nicht funktionieren.
Ich fühle mich wie es sollte eine Antwort sein, aber ich fürchte, du wirst zu haben, um einen guten Blick auf Ihre tatsächliche design und arbeiten Sie heraus, was Sie wirklich brauchen. Vielleicht löst (und gute Indizes) auf die Tabellen eingebunden, so dass änderungen, die möglicherweise etwas zu brechen kann roll es alles.
Aber ich hatte wirklich gehofft, in der Lage sein, etwas zu deuten, dass der Abfrageoptimierer möglicherweise in der Lage zu nutzen, um zu helfen, die Leistung Ihres Systems, aber ich glaube nicht, dass ich es kann.
InformationsquelleAutor der Antwort Rob Farley