Ich habe eine Konfigurationstabelle in meiner SQL Server-Datenbank und diese Tabelle sollte immer nur eine Zeile enthalten. Damit zukünftige Entwickler dies besser verstehen, möchte ich verhindern, dass mehr als eine Datenzeile hinzugefügt wird. Ich habe mich dafür entschieden, einen Auslöser zu verwenden, wie unten dargestellt ...
ALTER TRIGGER OnlyOneConfigRow
ON [dbo].[Configuration]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @HasZeroRows BIT;
SELECT @HasZeroRows = CASE
WHEN COUNT (Id) = 0 THEN 1
ELSE 0
END
FROM
[dbo].[Configuration];
IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
BEGIN
RAISERROR ('You should not add more than one row into the config table. ', 16, 1)
END
END
Dies löst keinen Fehler aus, lässt jedoch nicht zu, dass die erste Zeile eingegeben wird.
Gibt es auch eine effektivere / selbsterklärendere Möglichkeit, die Anzahl der Zeilen, die in eine Tabelle eingefügt werden können, auf nur 1 zu beschränken? Fehlt mir eine integrierte SQL Server-Funktion?
Antworten:
Diese beiden Einschränkungen würden ausreichen:
Sie benötigen sowohl die
PRIMARY KEY
(oder eineUNIQUE
Einschränkung), damit keine zwei Zeilen den gleichenID
Wert haben, als auch dieCHECK
Einschränkung, damit alle Zeilen den gleichenID
Wert haben (willkürlich ausgewählt1
).In Kombination begrenzen die beiden fast entgegengesetzten Einschränkungen die Anzahl der Zeilen entweder auf Null oder auf Eins.
Auf einem fiktiven DBMS (keine aktuelle SQL-Implementierung erlaubt diese Konstruktion), das einen Primärschlüssel aus 0 Spalten erlaubt, wäre dies auch eine Lösung:
quelle
Sie können die ID als berechnete Spalte definieren, die einen konstanten Wert ergibt, und diese Spalte als eindeutig deklarieren:
quelle
Sie können auch den Auslöser verwenden.
quelle
Scheint ein bisschen seltsam, ist aber zu laut :) Sie könnten nur eine Einschränkung für die Tabelle haben und dann nur Aktualisierungen (kein Einfügen oder Löschen) für die Tabelle zulassen?
Es ist ein bisschen hackig, das zu tun. Wäre es nicht besser, Änderungen an der Konfiguration durch eine gespeicherte Prozedur zu erzwingen, die dann diese ganze Logik für Sie handhaben kann?
quelle
ID
, einen Wert von0
oder einen negativen zu haben. Und wie @Mat zeigt, schlägt es fehl, wenn Sie versuchen, eine weitere Zeile einzufügen, wenn die erste gelöscht wird.INSERT INTO dbo.Config DEFAULT VALUES;
nur einmal vorgehen , aber Sie können ihrSET IDENTITY_INSERT dbo.Config ON; INSERT INTO dbo.Config (ID) VALUES (0); SET IDENTITY_INSERT dbo.Config OFF;
mehrere Male folgen , und Sie erhalten eine mehrzeilige Tabelle.