DEFAULT Constraint mit systemdefiniertem Namen löschen

By Frank Kalis

Posted on Nov 15, 2010 von in SQL Server

Dies passiert häufig, wenn man graphische Tools wie SSMS zum Tabellendesign verwendet oder seine CREATE TABLE Statements folgendermassen schreibt:

CREATE TABLE dbo.Foobar (
    col1 int DEFAULT(0), 
    col2 char(2)
);

Hierbei muss man die DEFAULT Constraint NICHT explizit benennen. Während die folgendeVariante zumindest eine Fehlermeldung auswirft:

CREATE TABLE dbo.Foobar (
    col1 int, 
    col2 char(2)
);

ALTER TABLE dbo.Foobar ADD CONSTRAINT DEFAULT (0) FOR col1;

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'DEFAULT'.

Zwar sieht man nicht auf den ersten Blick, dass das Fehlen des Namens für ein Constraint bemängelt wird, aber früher oder später kommt man doch darauf.

Hat man nun aber aus irgendeinem Grund seine Constraint nicht explizit benannt, generiert SQL Server automatisch einen Namen dafür. Dieser sieht dann so sprechend aus wie "DF__Foobar__col1__6371E77D". Nicht gerade etwas, was man sich leicht merken kann. Will man nun das Versäumnis der Namensgebung rückgängig machen und seine Constraints nun selber mit sprechenderen Namen versehen, kann man diesen systemgenerierten Namen aus sys.default_constraints folgendermassen abfragen:

DECLARE @constraint_name sysname;

SELECT
    @constraint_name = DC.name
FROM
    sys.default_constraints DC
    JOIN
    sys.columns C ON DC.parent_column_id = C.column_id
WHERE
    DC.parent_object_id = OBJECT_ID('dbo.Foobar') AND
    C.name = 'col1';

Zu diesen Zeitpunkt hat die Variable @constraint_name den Wert DF__Foobar__col1__6371E77D. Die Variable kann man anschliessend bequem in ein dynamisches Statement einbauen und ausführen:

IF @constraint_name IS NOT NULL
     EXEC ('ALTER TABLE dbo.Foobar DROP CONSTRAINT ' + @constraint_name);

Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: , ,

2 Kommentare

Benutzerwertungen
5 Stern:
 
(1)
4 Stern:
 
(0)
3 Stern:
 
(0)
2 Stern:
 
(0)
1 Stern:
 
(0)
1 Bewertung
Durschn. Benutzerwertung:
(5.0)
Hi Frank, alternativ kann man auch den innerhalb der Datenbank eindeutigen Namen ändern. Ist zwar kein ANSI, funktioniert aber trotzdem: EXEC [TestDB].dbo.sp_rename @objname = N'[DF__Foobar__col1__0A92DAAD]', @newname = N'MeinConstraint', @objtype = N'OBJECT'
17.11.10 @ 09:37
Ja, das funktioniert natürlich auch. :-)
18.11.10 @ 09:08


Formular wird geladen...