Як я можу змінити визначений користувачем тип таблиці в SQL Server?
Відповіді:
Це свого роду хакерство, але, здається, працює. Нижче наведені кроки та приклад зміни типу таблиці. Одне зауваження - модуль sp_refreshsqlмодулюватиме, якщо зміна, яку ви внесли до типу таблиці, є невід’ємною зміною цього об’єкта, як правило, процедурою.
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
УВАГА:
Це може бути руйнівним для вашої бази даних, тому вам спочатку потрібно перевірити це на середовищі розробки.
sp_refreshsqlmodle
після відтворення типу таблиці ви не запустите процес зберігання в магазині, збережений процес не вдасться сказати, що тип таблиці змінився. Я рекомендую запустити це на розробницькій версії вашої БД перед запуском у виробничій роботі.
sp_rename
на типі даних, який визначає користувач, викиньте мені помилку: Either the parameter @objname is ambiguous or the claimed @objtype ((null)) is wrong.
що може бути не так?
EXEC sys.sp_rename 'dbo.MyTableType', 'zMyTableType', 'OBJECT';
. Також переконайтеся, що ви включаєте схему для першого параметра, а не для другого.
Ось прості кроки, які мінімізують нудьгу і не вимагають схильних до помилок напівавтоматизованих сценаріїв або дорогих інструментів.
Майте на увазі, що ви можете генерувати оператори DROP / CREATE для декількох об’єктів з вікна Подробиці провідника об’єктів (при цьому генеруються сценарії DROP та CREATE, що полегшує введення логіки між діями Drop і Create):
Якщо у вас є менші проекти, де може мати сенс змінити архітектуру інфраструктури, розгляньте можливість усунення визначених користувачем типів таблиць. Entity Framework та подібні інструменти дозволяють перенести більшість, якщо не всю, логіки даних до бази коду, де її простіше підтримувати.
Якщо ви можете використовувати проект бази даних у Visual Studio, ви можете внести зміни в проект і скористатися схемою порівняння для синхронізації змін у вашій базі даних.
Таким чином, скидання та відтворення залежних об'єктів обробляється сценарієм змін.
Саймон Зейнстра знайшов рішення!
Але я використовував Visual Studio community 2015, і мені навіть не потрібно було використовувати порівняння схем.
Використовуючи SQL Server Object Explorer, я знайшов свій тип таблиці, визначений користувачем, у БД. Я клацнув правою кнопкою миші на типі таблиці та вибрав. Це відкрило вкладку коду в IDE із видимим та редагованим кодом TSQL . Я просто змінив визначення (у моєму випадку просто збільшив розмір поля nvarchar) і натиснув кнопку Оновити базу даних у верхньому лівому куті вкладки.
Гей, Престо! - швидка перевірка в SSMS, і визначення udtt було змінено.
Блискуче - дякую Саймоне.
Вам слід скинути старий тип таблиці та створити новий. Однак, якщо він має якісь залежності (будь-які збережені процедури, що використовують його), ви не зможете його скинути. Я опублікував чергову відповідь про те, як автоматизувати процес тимчасового скидання всіх збережених процедур, модифікації таблиці таблиць, а потім відновлення збережених процедур.
Ви не можете ЗМІНИТИ / ЗМІНИТИ ТИП. Вам потрібно скинути існуючий і заново створити його з правильним ім’ям / типом даних або додати новий стовпець / и