Как я могу изменить пользовательский тип таблицы в 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/CREATE для всех зависимостей (или генерировать для всех объектов "Программируемость", чтобы исключить необходимость поиска зависимостей).
- Между операторами DROP и CREATE [зависимостей] (после всех DROP, перед всеми CREATE) вставьте сгенерированные операторы DROP/CREATE [табличный тип], внося необходимые изменения с помощью CREATE TYPE.
- Запустите скрипт, который удаляет все зависимости /UDTT и затем воссоздает [UDTT с изменениями]/зависимости.
Если у вас есть небольшие проекты, в которых может иметь смысл изменить архитектуру инфраструктуры, рассмотрите возможность исключения пользовательских типов таблиц. Entity Framework и аналогичные инструменты позволяют перемещать большую часть, если не всю, логику данных в вашу кодовую базу, где ее проще поддерживать.
Ответ 4
Если вы можете использовать проект базы данных в Visual Studio, вы можете внести изменения в проект и сравнить схему с синхронизацией изменений с вашей базой данных.
Таким образом, сброс и восстановление зависимых объектов обрабатывается с помощью изменения script.
Ответ 5
Симон Зейнстра нашел решение!
Но я использовал сообщество Visual Studio 2015, и мне даже не пришлось использовать сравнение схемы.
Используя Обозреватель объектов SQL Server, я нашел свой определяемый пользователем тип таблицы в БД. Я щелкнул правой кнопкой мыши по типу таблицы и выбрал. Это открыло вкладку кода в среде IDE с видимым кодом TSQL и редактируемым. Я просто изменил определение (в моем случае просто увеличил размер поля nvarchar) и нажал кнопку "Обновить базу данных" в верхнем левом углу вкладки.
Привет, Престо! - быстрая проверка SSMS и определение udtt было изменено.
Блестящий - спасибо Саймону.
Ответ 6
вы не можете ALTER/MODIFY ваш ТИП. Вам необходимо отказаться от существующего и заново создать его с правильным именем/типом данных или добавить новый столбец/s
Ответ 7
Вы должны удалить старый тип таблицы и создать новый. Однако, если у него есть какие-либо зависимости (любые хранимые процедуры, использующие его), вы не сможете его удалить. Я опубликовал еще один ответ о том, как автоматизировать процесс временного удаления всех хранимых процедур, изменения таблицы таблиц и восстановления хранимых процедур.