it-swarm.com.de

ALTER TABLE DROP COLUMN ist fehlgeschlagen, da mindestens ein Objekt auf diese Spalte zugreift

Ich versuche das zu tun:

ALTER TABLE CompanyTransactions DROP COLUMN Created

Aber ich verstehe:

Meldung 5074, Ebene 16, Status 1, Zeile 2 Das Objekt 'DF__CompanyTr__Creat__0CDAE408' ist abhängig von der Spalte 'Erstellt'. Meldung 4922, Ebene 16, Status 9, Zeile 2 ALTER TABLE DROP COLUMN Created ist fehlgeschlagen, da mindestens ein Objekt auf diese Spalte zugreift.

Dies ist eine Code-First-Tabelle. Irgendwie sind die Migrationen völlig durcheinander geraten und ich versuche, einige Änderungen manuell zurückzusetzen.

Ich habe nein Ahnung was das ist:

DF__CompanyTr__Creat__0CDAE408
41
Casey Crookston

Sie müssen constraints aus der Spalte entfernen, bevor Sie die Spalte entfernen können. Der Name, auf den Sie verweisen, ist ein default constraint.

z.B.

alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
80
SqlZim

Die Antwort von @ SqlZim ist richtig, aber nur um zu erklären, warum dies möglicherweise passiert ist. Ich hatte ein ähnliches Problem und dies wurde durch eine sehr unschuldige Sache verursacht: Hinzufügen eines Standardwerts zu einer Spalte

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int DEFAULT NULL;

Im Bereich von MS SQL Server ist ein Standardwert für eine Spalte jedoch ein CONSTRAINT. Und wie jede Einschränkung hat sie eine Kennung. Und Sie können eine Spalte nicht löschen, wenn sie in einem CONSTRAINT verwendet wird.

Sie können diese Art von Problemen also tatsächlich vermeiden, indem Sie Ihren Standardeinschränkungen immer einen expliziten Namen geben, zum Beispiel:

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int NULL,
  CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;

Sie müssen die Einschränkung noch löschen, bevor Sie die Spalte löschen können, aber Sie werden zumindest den Namen im Voraus kennen .

14
malloc4k

Wie bereits in den Antworten beschrieben, müssen Sie Einschränkungen (die automatisch von SQL erstellt werden) für alle Spalten löschen, die Sie löschen möchten.

Führen Sie die folgenden Schritte aus, um das Notwendige zu tun.

  1. Abrufen des Namens aller Einschränkungen mit sp_helpconstraint, einem Dienstprogramm für gespeicherte Systemprozeduren. Führen Sie Folgendes aus: exec sp_helpconstraint '<your table name>'
  2. Sobald Sie den Namen der Einschränkung erhalten haben, kopieren Sie diesen Einschränkungsnamen und führen Sie die nächste Anweisung aus, d. H. alter table <your_table_name> drop constraint <constraint_name_that_you_copied_in_1>
  3. Sobald Sie die Einschränkung gelöscht haben, können Sie eine oder mehrere Spalten mit einer herkömmlichen Methode löschen, d. H. Alter table <YourTableName> Drop column column1, column2 Usw
3
vibs2006

Wenn Sie die Spalte datatype ändern, müssen Sie constraint key für jede Datenbank

  alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
0
Jayant Wexoz

Sie müssen ein paar Dinge tun:

  1. Sie müssen zuerst überprüfen, ob die Einschränkung im Informationsschema vorhanden ist
  2. dann müssen Sie eine Abfrage durchführen, indem Sie sys.default_constraints und sys.columns verbinden, wenn die Spalten und default_constraints die gleichen Objekt-IDs haben
  3. Wenn Sie in Schritt 2 beitreten, erhalten Sie den Einschränkungsnamen von default_constraints. Sie lassen diese Einschränkung fallen. Hier ist ein Beispiel für einen solchen Tropfen, den ich gemacht habe.
-- 1. Remove constraint and drop column
IF EXISTS(SELECT *
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = N'TABLE_NAME'
            AND COLUMN_NAME = N'LOWER_LIMIT')
   BEGIN
    DECLARE @sql NVARCHAR(MAX)
    WHILE 1=1
        BEGIN
            SELECT TOP 1 @sql = N'alter table [TABLE_NAME] drop constraint ['+dc.name+N']'
            FROM sys.default_constraints dc
            JOIN sys.columns c
            ON c.default_object_id = dc.object_id
            WHERE dc.parent_object_id = OBJECT_ID('[TABLE_NAME]') AND c.name = N'LOWER_LIMIT'
            IF @@ROWCOUNT = 0
                BEGIN
                    PRINT 'DELETED Constraint on column LOWER_LIMIT'
                    BREAK
                END
        EXEC (@sql)
    END;
    ALTER TABLE TABLE_NAME DROP COLUMN LOWER_LIMIT;
    PRINT 'DELETED column LOWER_LIMIT'
   END
ELSE
   PRINT 'Column LOWER_LIMIT does not exist'
GO
0
Akash Yellappa