1

Ich bin in meiner aktuellen Position auf eine Datenbank gestoßen, die eine TLC-Liste benötigt. Es gibt viele Querverweistabellen, die alle gleich sind Strukturschema weise, und alle Trigger verwenden, um Geschäftslogik oder Domänenintegrität zu erzwingen, wie es scheint. Ich versuche herauszufinden, ob ich einige der Auslöser durch Einschränkungen ersetzen kann. Im Folgenden finden Sie eine typische Tabellendefinition, die diesem Muster entspricht. Es gibt etwa 400 dieser Tabellen, die alle die gleiche triggerbasierte Lösung verwenden.So richten Sie eine zusätzliche Integritätsbedingung für 1: n-Beziehung ohne Verwendung von Triggern ein

CREATE TABLE dbo.FooXRef 
(
FooXRefID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
BarID INT NOT NULL CONSTRAINT [fk_Bar] FOREIGN KEY REFERENCES dbo.Bar(BarID), 
DefaultRecord BIT NOT NULL CONSTRAINT [DF_FooXRef_Default] DEFAULT(1) 
); 

Die Regel dort zu sein unendliche Anzahl von Datensätzen mit dem gleichen Wert in BarID und DefaultRecord = 0, aber nur ein einzelner Datensatz existieren kann existieren können, wo BarID in der Tabelle ist und DefaultRecord = 1.

Welche Art von Einschränkung müsste ich einrichten, um diese Kombination zu ermöglichen?

Diese Tabellenstruktur und Trigger zum Erzwingen dieser Kombination ist 400 in der aktuellen Datenbank, und in der nächsten bin ich in die Tausende. Ist es einfach nicht möglich, eine Einschränkung einzurichten, die in diesem Fall funktioniert?

+0

Leider, basierend auf dem Beispiel, müssen Sie das programmgesteuert beibehalten. –

+0

Gibt Ihnen das Beispiel [hier] (https://technet.microsoft.com/en-us/library/ms188258%28v=sql.105%29.aspx) irgendwelche Ideen? – HABO

Antwort

2

Hier ist eine mögliche Variante ohne einen Trigger zu verwenden.

Erstellen Sie einen gefilterten eindeutigen Index für (BarID, DefaultRecord) mit der Filterbedingung WHERE ([DefaultRecord]=(1)).

Mit einem solchen Index können Sie nur eine Zeile pro BarID mit DefaultRecord = 1 einfügen.

Es ist möglich, eine Nullzahl von Zeilen mit DefaultRecord = 1 zu haben.

Es ist möglich, eine beliebige Anzahl von Zeilen mit DefaultRecord = 0 zu haben.

CREATE UNIQUE NONCLUSTERED INDEX [IX_DefaultRecord] ON [dbo].[FooXRef] 
(
    [BarID] ASC, 
    [DefaultRecord] ASC 
) 
WHERE ([DefaultRecord]=(1)) 
+0

Ja, es ist möglich, 0 Zeilen mit Standard-Datensatz = 1 zu haben. Ja, es ist auch möglich, eine beliebige Anzahl von Zeilen zu haben, wobei Standard-Datensatz = 0 ist. Ich werde versuchen, Ihren Vorschlag anzuwenden und zu sehen, wo ich komme. – SSISPissesMeOff

+0

arbeitete wie ein Charme. vielen Dank. Ich dachte nicht einmal an einen eindeutigen Index im Gegensatz zu einer Prüfbedingung. – SSISPissesMeOff

+0

Gern geschehen. Ich bin froh, dass Sie diese Antwort nützlich fanden. Ich habe den Titel der Frage bearbeitet und versucht, ihn beschreibender zu machen. –

Verwandte Themen