Сценарий SQL Server Flyway — проблема с ограничением удаления столбца

Я работаю над SQL Server и пытаюсь удалить столбец. Схема таблицы следующая:

CREATE TABLE [dbo].[XYZ](
    [ID] [int] NOT NULL,
    [DSC] [varchar](255) NULL,
    [LOWER_LIMIT] [int] NOT NULL,
    [UPPER_LIMIT] [int] NOT NULL,
CONSTRAINT [XP_XYZ] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Когда я пытаюсь удалить столбец:

ALTER TABLE [SENSOR]
  DROP COLUMN LOWER_LIMIT;

Меня просят отказаться от ограничения до:

The object 'DF__SENSOR__LOWER_LI__08B54D69' is dependent on column 'LOWER_LIMIT'.
    Msg 4922, Level 16, State 9, Line 45
    ALTER TABLE DROP COLUMN LOWER_LIMIT failed because one or more objects access this column.

Теперь я пишу сценарий пролетного пути, чтобы удалить столбец, и я не узнаю ограничение, пока не запущу команду удаления, поскольку ограничение изменяется в более высоких средах, и я пытаюсь удалить столбец. Как составить план полета, чтобы убрать эту колонку?


person Akash Yellappa    schedule 20.06.2019    source источник


Ответы (1)


Наконец, с помощью Stackoverflow я смог сделать что-то вроде этого:

     IF EXISTS(SELECT *
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = N'SENSOR'
            AND COLUMN_NAME = N'LOWER_LIMIT')
   BEGIN
    DECLARE @sql NVARCHAR(MAX)
    WHILE 1=1
        BEGIN
            SELECT TOP 1 @sql = N'alter table [SENSOR] 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('[SENSOR]') AND c.name = N'LOWER_LIMIT'
            IF @@ROWCOUNT = 0 
                BEGIN
                    PRINT 'DELETED Constraint on column LOWER_LIMIT' 
                    BREAK
                END
        EXEC (@sql)
    END;
    ALTER TABLE [SENSOR] DROP COLUMN LOWER_LIMIT;
    PRINT 'DELETED column LOWER_LIMIT' 
   END
ELSE
   PRINT 'Column LOWER_LIMIT does not exist'
GO

Исходный пост находится здесь

person Akash Yellappa    schedule 20.06.2019