![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в T-SQL удалить IDENTITY у поля? [MSSQL]
Ольга © (2005-08-29 12:19:00)ALTER TABLE T1 ALTER COLUMN ID int
Как сюда вписать, что поле ID IDENTITY=false?
Anatoly Podgoretsky (2005-08-30 10:04:00) [1]Ega23 © (30.08.05 09:56) [15]
Как правило так значительно быстрее, чем через поле, но теже 6 системно независимых шагов.
Ega23 (2005-08-30 09:56:00) [2]2 Ольга (29.08.05 14:22) [3]
Мне нужно убрать IDENTITY насовсем. Программно.
Неужели для этого есть только один путь:
создать временную таблицу;
переписать в нее данные;
удалить старую таблицу;
переименовать новую в старую?
PowerDesigner генерит такой скрипт:
1. Создаёт временную таблицу
2. Insert into ... Select * from ...
3. Удаляет старую
4. Создаёт новую
5. Insert into ... Select * from ...
6. Удаляет временную.
paul_k (2005-08-30 09:49:00) [3]Anatoly Podgoretsky © (29.08.05 17:57) [12]
пункт 1
отключить всех пользователей от базы кроме себя:)
Anatoly Podgoretsky (2005-08-29 17:58:00) [4]переименовать новое уже системно-зависимо, может быть не поддержано.
Anatoly Podgoretsky (2005-08-29 17:57:00) [5]Ольга (29.08.05 15:12) [10]
довавить поле
переписать данные
удалить старое поле
переименовать новое
Какие 2 шага я пропустила (транзакцию я не считаю)?
добавить временное поле
скопировать данные
удалить старое поле
создать новое поле
скопировать данные
удалить временное поле
Val (2005-08-29 17:35:00) [6]переименовать новое - 1 шаг?
Ольга (2005-08-29 15:12:00) [7]
> И зачем это делать программно?
База боевая, работает у N удаленных клиентов, которые максимум на что способны - это вслепую выполнить скрипт.
> в 6 шагов
довавить поле
переписать данные
удалить старое поле
переименовать новое
Какие 2 шага я пропустила (транзакцию я не считаю)?
Anatoly Podgoretsky (2005-08-29 15:01:00) [8]Ольга (29.08.05 14:49) [7]
И зачем это делать программно? Почему нельзя с помощью EM?
Если есть серьезные препятсвия, то тогда через временный столбец в 6 шагов, это системно независимый путь.
Nikolay M. (2005-08-29 14:53:00) [9]
> Ольга (29.08.05 14:41) [5]
> Ну так у сервера нет мозгов,
Во-первых, ЕМ - это не сервер.
Во-вторых, делает он, как было сказано, абсолютно правильно.
В-третьих, человек с интеллектом может попробовать снять 7-й бит (128 dec = 80 hex) в столбце syscolumns.status, но делать это крайне не рекомендуется :)
Ольга (2005-08-29 14:49:00) [10]Сдаюсь. Буду создавать поле. Дело, конечно, разовое, но в таблицах десятки млн. записей... Ну так и не мне "лопатой махать" - серверу.
ANB (2005-08-29 14:42:00) [11]
> Ольга (29.08.05 14:41) [5]
- сервер делает абсолютно правильно. Смену типа лучше и самим так делать. Безопаснее.
Ольга (2005-08-29 14:41:00) [12]
> [2]
Ну так у сервера нет мозгов, он действует в лоб (даже, если сменить тип поля с varchar(30) на varchar(40), он переписывает всю таблицу), а для человека с интеллектом должны же быть обходные пути (правда, моего интеллекта не хватило).
Nikolay M. (2005-08-29 14:32:00) [13]
> Ольга (29.08.05 14:22) [3]
Рулить структурой БД программно - не есть гуд.
Повторюсь: можно создавать не новую таблицу, а столбец в таблице - скорее всего, это будет быстрее, чем перелив всей таблицы целиком.
Ольга (2005-08-29 14:22:00) [14]Мне нужно убрать IDENTITY насовсем. Программно.
Неужели для этого есть только один путь:
создать временную таблицу;
переписать в нее данные;
удалить старую таблицу;
переименовать новую в старую?
Nikolay M. (2005-08-29 14:21:00) [15]Никак. Только созданием рядом новой таблицы или столбца. ЕМ, к примеру, создает таблицу - можете в этом убедиться, сняв у какой-нибудь таблицы IDENTITY и сгенерив потом change script.
Oksana (2005-08-29 13:49:00) [16]похоже, что с помощью T-SQL никак
но после
SET IDENTITY_INSERT Т1 ON
можно передавать свое значение в identity column:
insert into Т1(id, ...) values ( 5,... )