2010-12-16 7 views
5

Necesito quitar una columna de una tabla, pero cuando trato de eliminarlo:columna de gota y todos los objetos dependientes utilizando un lenguaje de definición de datos

El objeto 'object_name' depende en la columna COLUMN_NAME .

ALTER TABLE DROP COLUMN column_name ha fallado porque uno o más objetos tienen acceso a esta columna .

puedo buscar la dependencia en las tablas del sistema y eliminarlo manualmente, pero necesito hacer una migración (utilizando SQL DDL) por lo que todos los demás miembros del equipo simplemente la actualización, ejecute la migración y don Tiene que estropear los objetos del sistema.

Respuesta

11

Prueba este código:

Declare @TABLENAME varchar(max), @COLUMN varchar(max) 
SET @TABLENAME = 'YOURTableName' 
SET @COLUMN = 'YOURColumnName' 
Declare @CONSTRAINT varchar(max) 
        set @CONSTRAINT ='ALTER TABLE '[email protected]+' DROP CONSTRAINT ' 
        set @CONSTRAINT = @CONSTRAINT + (select SYS_OBJ.name as CONSTRAINT_NAME 
        from sysobjects SYS_OBJ 
        join syscomments SYS_COM on SYS_OBJ.id = SYS_COM.id 
        join sysobjects SYS_OBJx on SYS_OBJ.parent_obj = SYS_OBJx.id 
        join sysconstraints SYS_CON on SYS_OBJ.id = SYS_CON.constid 
        join syscolumns SYS_COL on SYS_OBJx.id = SYS_COL.id 
        and SYS_CON.colid = SYS_COL.colid 
        where 
        SYS_OBJ.uid = user_id() and SYS_OBJ.xtype = 'D' 
        and [email protected] and [email protected]) 
        exec(@CONSTRAINT) 

y ejecute la modificación de tabla periódica:

ALTER TABLE YOURTABLENAME 
DROP COLUMN YOURCOLUMNNAME 

con el primer código de quitar todas las dependencias de esa columna y luego se puede quitar sin problemas .

EDIT - Extracción de valores por defecto Restricciones:

El código anterior no parece eliminar DEFAULT_CONSTRAINTS así, en ese caso también se deben utilizar:

DECLARE @ConstraintName nvarchar(200) 
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = OBJECT_ID(N'__TableName__')) 
IF @ConstraintName IS NOT NULL 
    EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName) 
Cuestiones relacionadas