Изменить SCHEMABINDING для существующего просмотра - PullRequest
0 голосов
/ 11 июня 2018

У меня есть существующая база данных (проект SSDT в качестве источника), где я должен обновить таблицу. Я изменяю только тип столбца с nvarchar(MAX) на nvachar(256).Проблема в том, что у меня есть существующее представление, связанное с этой таблицей с SCHEMABINDING.Я не могу редактировать столбец таблицы, потому что SCHEMABINDING предотвращает изменения, которые влияют на VIEW.

Следующий скрипт выполняется в PreDeploymentScript.Когда я вызываю оператор DROP VIEW [base].[VIEW_DEPENDING_ON_TABLE], после развертывания представление отсутствует.Моя идея состоит в том, чтобы отключить SCHEMABINDING во время развертывания и включить его после завершения.Как это возможно в скрипте TSQL?Или есть лучший способ сделать это?

IF EXISTS ( SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = N'base'
        AND TABLE_NAME = 'TABLENAME'
        AND COLUMN_NAME = 'Instance'
        AND CHARACTER_MAXIMUM_LENGTH = -1)
AND NOT EXISTS (SELECT * FROM sys.indexes WHERE name='IX_TABLENAME_Instance' AND object_id = OBJECT_ID(N'[base].[TABLENAME]'))
BEGIN

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[base].[VIEW_DEPENDING_ON_TABLE]') AND type in (N'V'))
    BEGIN
        DROP VIEW [base].[VIEW_DEPENDING_ON_TABLE]
    END

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[base].[TABLENAME]') AND type in (N'U'))
    BEGIN
        UPDATE [base].[TABLENAME] SET [Instance] = LEFT(Instance, 256)
        ALTER TABLE [base].[TABLENAME] ALTER COLUMN [Instance] NVARCHAR(256)
    END

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[base].[TABLENAME]') AND type in (N'U'))
    BEGIN
        CREATE NONCLUSTERED INDEX [IX_TABLENAME_Instance] ON [base].[TABLENAME]
        (
            [Instance] ASC
        ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    END
END
GO

1 Ответ

0 голосов
/ 11 июня 2018

Нет команды для отключения WITH SCHEMABINDING.Это можно сделать, либо отбросив представление и создав его заново без опции, либо просто изменив его.В вашем случае:

ALTER VIEW [base].[VIEW_DEPENDING_ON_TABLE]
-- WITH SCHEMABINDING
AS
    SELECT ...;

После внесения изменений в базовую таблицу вы можете снова изменить представление:

ALTER VIEW [base].[VIEW_DEPENDING_ON_TABLE]
WITH SCHEMABINDING
AS
    SELECT ...;

У вас нет сценария под рукой?Это нормально, вы можете вытащить его из sys.sql_modules, но для преобразования из CREATE в ALTER и удаления WITH SCHEMABINDING потребуется некоторый массаж.Вы могли бы написать код, который его анализирует, но это очень хрупко, поскольку замена или комментирование фразы «с привязкой к схеме» может быть очень сложной - она ​​может содержать несколько раз пробел, табуляции, возврат каретки, непечатные символы и т. Д.,и он также может существовать в других частях кода (например, комментарий или даже псевдоним таблицы или столбца).

...