Добавление столбца идентификаторов в целочисленный столбец без идентификаторов в SQL Server 2005 - PullRequest
1 голос
/ 12 ноября 2009

Я знаю, как это сделать, и, кроме того, об этом спрашивали многие люди в STACK OVER, а также куча вещей, доступных в сети.

Однако, пока гуглил, наткнулся на что-то интересное (по крайней мере, для меня) добавление IDENTITY в существующий столбец

Решение вышеуказанного вопроса (получено с этого сайта в нижней части страницы) похоже на

sp_configure 'allow update', 1
go
reconfigure with override
go
 update syscolumns set colstat = 1
where id = object_id('table1') and name = 'ID'
go
 exec sp_configure 'allow update', 0
go
reconfigure with override
go

Итак, я сделал снимок с соответствующими именами таблиц и столбцов и обнаружил следующее

Configuration option 'allow updates' changed from 1 to 1. Run the RECONFIGURE statement to install.
Msg 259, Level 16, State 1, Line 1
Ad hoc updates to system catalogs are not allowed.
Configuration option 'allow updates' changed from 1 to 0. Run the RECONFIGURE statement to install.

Что я делаю не так?

Пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 12 ноября 2009

Цитата из Micheal Hotek :

более 15 годы Microsoft говорила все, чтобы НЕ напрямую обновлять систему таблицы и что функциональность будет удален позже. Вы НЕ может сделать это в Oracle или DB2. Это это чрезвычайно плохая идея и невероятно плохая практика. В SQL Сервер 2000, были крошечные количество случаев прямого обновления должно было быть сделано, потому что не было другой путь. (Там нет ни одного пример в этой теме, который будет потребовал прямой системный стол модификация в SQL Server 2000 и до сих пор каждый случай предлагают для завинчивания с системными данными является результатом плохой код встречает плохие практики.) Снятие возможности непосредственно винт вокруг с данными в системных таблицах является USER запрос, и я один из тех, пользователи, которые будут кричать, если кто-нибудь решает, что это хорошая идея вернуть способность кого-то полностью взорвать экземпляр с щелчок кнопки. Переписать системные каталоги как были и всегда будет чрезвычайно плохой идеей.

Чтобы сделать то, что вы хотите, вам нужно создать новую таблицу со столбцом идентификаторов, скопировать старые значения в новую таблицу, удалить старую таблицу и переименовать новую. Пример можно найти здесь

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

2 голосов
/ 13 ноября 2009

Ну, вы не можете - точка. По крайней мере, не в SQL Server 2005 и выше.

Что вам нужно сделать, это добавить новый столбец как INT IDENTITY, удалить старый столбец, а затем переименовать новый в старое имя.

Это немного запутанно, но работает и надежно работает.

ALTER TABLE dbo.YourTable
  ADD NewColumn INT IDENTITY(1,1) 

ALTER TABLE dbo.YourTable
  DROP COLUMN OldColumn

EXEC sys.sp_rename @objname = 'dbo.YourTable.NewColumn', 
                   @newname = 'OldColumn', 
                   @objtype = 'COLUMN'
2 голосов
/ 12 ноября 2009

Этот пример кода, особенно таблица "syscolumns", звучит так, как будто он может работать в SQL 2000, а может быть и в 7.0. В этих версиях системные таблицы могут быть изменены напрямую с помощью показанного процесса. (Однажды поздно вечером мы с другом сбросили учетную запись SA на машине, которая была восстановлена ​​на следующий день ...)

В SQL 2005 Microsoft пересмотрела внутренние компоненты SQL, чтобы системные таблицы больше не были доступны напрямую или были взломаны. Различные системные таблицы "sys.XXX" на самом деле являются представлениями реальных таблиц, и эти таблицы нельзя изменить напрямую. (На самом деле, я подозреваю, что выделенный хакер может чем-то управлять, но я еще не пробовал.)

«syscolumns» все еще существует в SQL 2005 и более поздних версиях, но, вероятно, это просто представление о sys.columns.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...