DEFAULT Constraint mit systemdefiniertem Namen löschen

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);

  • *****
    Kommentar von: Christoph Muthmann
    17.11.10 @ 09:37:51

    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'

  • Kommentar von: Frank Kalis
    18.11.10 @ 09:08:59

    Ja, das funktioniert natürlich auch. :-)

Einen Kommentar hinterlassen

Ihre E-Mail-Adresse wird nicht auf dieser Seite angezeigt.
SchlechtExzellent
(Zeilenumbrüche werden zu <br />)
(For my next comment on this site)
(Allow users to contact me through a message form -- Your email will not be revealed!)
Dies ist ein Captcha Bild. Es wird benutzt, um Massenzugriffe von Robotern zu verhindern.
Bitte gib die Zeichen des obigen Bildes ein. (Groß/Kleinschreibung ist wichtig)
Trackback-Adresse für diesen Eintrag
Dies ist ein Captcha Bild. Es wird benutzt, um Massenzugriffe von Robotern zu verhindern.
Bitte gib die Zeichen des obigen Bildes ein. (Groß/Kleinschreibung ist wichtig)