CHECK-Einschränkungen

CHECK-Einschränkungen erzwingen die Domänenintegrität, indem sie die Werte begrenzen, die in einer Spalte zulässig sind. Sie sind insofern FOREIGN KEY-Einschränkungen ähnlich, als sie die Werte kontrollieren, die in eine Spalte geschrieben werden. Sie unterscheiden sich jedoch in der Methode, mit der die für eine Spalte gültigen Werte bestimmt werden: FOREIGN KEY-Einschränkungen rufen die Liste der gültigen Werte von einer anderen Tabelle ab, und CHECK-Einschränkungen ermitteln die gültigen Werte anhand eines logischen Ausdrucks, der nicht auf Daten in einer anderen Spalte basiert. Es ist z. B. möglich, den Bereich der Werte für eine salary-Spalte zu begrenzen, indem eine CHECK-Einschränkung erstellt wird, die nur Daten zwischen 15.000 € und 100.000 € zulässt. Auf diese Weise wird verhindert, dass Daten eingegeben werden können, die außerhalb des normalen Einkommensbereichs liegen.

Sie können eine CHECK-Einschränkung mit jedem logischen (booleschen) Ausdruck erstellen, der basierend auf den logischen Operatoren TRUE oder FALSE zurückgibt. Für das zuvor beschriebene Beispiel wird der folgende logische Ausdruck verwendet:

Sie können mehrere CHECK-Einschränkungen auf eine einzelne Spalte anwenden. Es ist auch möglich, eine einzelne CHECK-Einschränkung auf mehrere Spalten anzuwenden, indem die Einschränkung auf Tabellenebene erstellt wird. So könnte z. B. eine CHECK-Einschränkung für mehrere Spalten verwendet werden, um sicherzustellen, dass jede Zeile mit dem Wert USA in der country-Spalte auch einen aus zwei Zeichen bestehenden Wert in der state-Spalte aufweist. Auf diese Weise können mehrere Bedingungen an einer Stelle überprüft werden.

VorsichtshinweisVorsicht

Einschränkungen, die implizite oder explizite Datentypkonvertierungen einschließen, können bei bestimmten Vorgängen einen Fehler erzeugen. So können z. B. Einschränkungen, die für Tabellen definiert werden, die ihrerseits die Quellen von Partitionswechseln sind, bei einer ALTER TABLE...SWITCH-Operation zu einem Fehler führen. Vermeiden Sie deshalb die Datentypkonvertierung in Einschränkungsdefinitionen.

Beschränkungen bei CHECK-Einschränkungen

CHECK-Einschränkungen weisen Werte zurück, die als FALSE ausgewertet werden. Da NULL-Werte als UNKNOWN ausgewertet werden, kann deren Vorhandensein in Ausdrücken zum Überschreiben einer Einschränkung führen. Angenommen, Sie platzieren z. B. eine Einschränkung für eine int-Spalte MyColumn und geben darin an, dass MyColumn ausschließlich den Wert 10 enthalten darf (MyColumn=10). Wenn Sie dann den Wert NULL in MyColumn einfügen, wird von Database Engine (Datenbankmodul) der Wert NULL eingefügt, und es wird kein Fehler zurückgegeben.

Eine CHECK-Einschränkung gibt TRUE zurück, wenn die von ihr überprüfte Bedingung für alle Zeilen in der Tabelle nicht FALSE ist. Wenn eine gerade erstellte Tabelle über keinerlei Zeilen verfügt, wird jede CHECK-Einschränkung für diese Tabelle als gültig betrachtet. Dieser Umstand kann zu unerwarteten Ergebnissen führen, wie das im folgenden Beispiel gezeigt wird.

CREATE TABLE CheckTbl (col1 int, col2 int);
GO
CREATE FUNCTION CheckFnctn()
RETURNS int
AS 
BEGIN
   DECLARE @retval int
   SELECT @retval = COUNT(*) FROM CheckTbl
   RETURN @retval
END;
GO
ALTER TABLE CheckTbl
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 );
GO

Die hinzugefügte CHECK-Einschränkung gibt an, dass es mindestens eine Zeile in der CheckTbl-Tabelle geben muss. Da es aber in der Tabelle keine Zeilen gibt, für die die Bedingung dieser Einschränkung überprüft werden kann, wird die ALTER TABLE-Anweisung erfolgreich ausgeführt.

CHECK-Einschränkungen werden beim Ausführen von DELETE-Anweisungen nicht überprüft. Deshalb kann das Ausführen von DELETE-Anweisungen für Tabellen mit bestimmten Typen von CHECK-Einschränkungen zu unerwarteten Ergebnissen führen. Betrachten Sie beispielsweise das Ausführen der folgenden Anweisungen für die CheckTbl-Tabelle.

INSERT INTO CheckTbl VALUES (10, 10)
GO
DELETE CheckTbl WHERE col1 = 10;

Die DELETE-Anweisung wird erfolgreich ausgeführt, obwohl die CHECK-Einschränkung angibt, dass die CheckTbl-Tabelle über mindestens 1 Zeile verfügen muss.