Удалить столбец и все зависимые объекты, используя язык определения данных - PullRequest
5 голосов
/ 16 декабря 2010

Мне нужно удалить столбец из таблицы, но когда я пытаюсь удалить его:

Объект 'имя_объекта' зависит от столбца 'имя_ столбца'.

ALTERTABLE DROP COLUMN имя_ столбца не удалось, потому что один или несколько объектов обращаются к этому столбцу.

Я могу найти зависимость в системных таблицах и удалить ее вручную, но мне нужно выполнить миграцию (с использованием SQL DDL ), поэтому все остальные члены команды просто обновляют данные, запускают миграцию и не нужно портить системные объекты.

1 Ответ

11 голосов
/ 16 декабря 2010

Попробуйте этот код:

Declare @TABLENAME varchar(max), @COLUMN varchar(max)
SET @TABLENAME = 'YOURTableName'
SET @COLUMN = 'YOURColumnName'
Declare @CONSTRAINT varchar(max)
                    set @CONSTRAINT ='ALTER TABLE '+@TABLENAME+' 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 SYS_OBJx.name=@TABLENAME and SYS_COL.name=@COLUMN)
                    exec(@CONSTRAINT)

и затем запустите вашу обычную таблицу изменений:

ALTER TABLE YOURTABLENAME
DROP COLUMN YOURCOLUMNNAME

С первым кодом вы удаляете все зависимости в этом столбце, а затем можете удалить его без проблем.

EDIT - Удаление ограничений по умолчанию:

Код выше, похоже, не удаляет DEFAULT_CONSTRAINTS, поэтому в этом случае вы также должны использовать:

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