Изменение пользовательских типов таблиц в SQL Server

Как я могу изменить пользовательский тип таблицы в SQL Server?

Ответ 1

Насколько мне известно, невозможно изменить/изменить тип таблицы. Вы может создать тип с другим именем, а затем удалить старый тип и измените его на новое имя

Кредиты jkrajes

Согласно msdn, это похоже на "Определенное пользователем определение типа таблицы не может быть изменено после его создания".

Ответ 2

Это своего рода хак, но, похоже, работает. Ниже приведены шаги и пример изменения типа таблицы. Одна нота: sp_refreshsqlmodule будет терпеть неудачу, если изменение, внесенное вами в тип таблицы, является нарушением этого объекта, как правило, процедурой.

  • Используйте sp_rename, чтобы переименовать тип таблицы, я обычно просто добавляю z к начало имени.
  • Создайте новый тип таблицы с оригинальным именем и любыми изменениями вам нужно сделать тип таблицы.
  • Пройдите через каждую зависимость и запустите sp_refreshsqlmodule на нем.
  • Отбросьте тип переименованной таблицы.

EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType';
GO
CREATE TYPE dbo.MyTableType AS TABLE(
    Id INT NOT NULL,
    Name VARCHAR(255) NOT NULL
);
GO
DECLARE @Name NVARCHAR(776);

DECLARE REF_CURSOR CURSOR FOR
SELECT referencing_schema_name + '.' + referencing_entity_name
FROM sys.dm_sql_referencing_entities('dbo.MyTableType', 'TYPE');

OPEN REF_CURSOR;

FETCH NEXT FROM REF_CURSOR INTO @Name;
WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXEC sys.sp_refreshsqlmodule @name = @Name;
    FETCH NEXT FROM REF_CURSOR INTO @Name;
END;

CLOSE REF_CURSOR;
DEALLOCATE REF_CURSOR;
GO
DROP TYPE dbo.zMyTableType;
GO

Внимание:

Это может быть разрушительным для вашей базы данных, поэтому сначала вы должны проверить это в среде разработки.

Ответ 3

Вот простые шаги, которые минимизируют скуку и не требуют склонных к ошибкам полуавтоматических сценариев или дорогих инструментов.

Помните, что вы можете сгенерировать операторы DROP/CREATE для нескольких объектов из окна "Подробности обозревателя объектов" (при этом сценарии DROP и CREATE группируются, что упрощает вставку логики между действиями "Удалить" и "Создать"):

Drop and Create To

  1. Создайте резервную копию базы данных на случай, если что-то пойдет не так!
  2. Автоматически генерировать операторы DROP/CREATE для всех зависимостей (или генерировать для всех объектов "Программируемость", чтобы исключить необходимость поиска зависимостей).
  3. Между операторами DROP и CREATE [зависимостей] (после всех DROP, перед всеми CREATE) вставьте сгенерированные операторы DROP/CREATE [табличный тип], внося необходимые изменения с помощью CREATE TYPE.
  4. Запустите скрипт, который удаляет все зависимости /UDTT и затем воссоздает [UDTT с изменениями]/зависимости.

Если у вас есть небольшие проекты, в которых может иметь смысл изменить архитектуру инфраструктуры, рассмотрите возможность исключения пользовательских типов таблиц. Entity Framework и аналогичные инструменты позволяют перемещать большую часть, если не всю, логику данных в вашу кодовую базу, где ее проще поддерживать.

Ответ 4

Если вы можете использовать проект базы данных в Visual Studio, вы можете внести изменения в проект и сравнить схему с синхронизацией изменений с вашей базой данных.

Таким образом, сброс и восстановление зависимых объектов обрабатывается с помощью изменения script.

Ответ 5

Симон Зейнстра нашел решение!

Но я использовал сообщество Visual Studio 2015, и мне даже не пришлось использовать сравнение схемы.

Используя Обозреватель объектов SQL Server, я нашел свой определяемый пользователем тип таблицы в БД. Я щелкнул правой кнопкой мыши по типу таблицы и выбрал. Это открыло вкладку кода в среде IDE с видимым кодом TSQL и редактируемым. Я просто изменил определение (в моем случае просто увеличил размер поля nvarchar) и нажал кнопку "Обновить базу данных" в верхнем левом углу вкладки.

Привет, Престо! - быстрая проверка SSMS и определение udtt было изменено.

Блестящий - спасибо Саймону.

Ответ 6

вы не можете ALTER/MODIFY ваш ТИП. Вам необходимо отказаться от существующего и заново создать его с правильным именем/типом данных или добавить новый столбец/s

Ответ 7

Вы должны удалить старый тип таблицы и создать новый. Однако, если у него есть какие-либо зависимости (любые хранимые процедуры, использующие его), вы не сможете его удалить. Я опубликовал еще один ответ о том, как автоматизировать процесс временного удаления всех хранимых процедур, изменения таблицы таблиц и восстановления хранимых процедур.