Я розробник Java, який трапився в команду без DBA, і там, де як розробник, я не можу отримати права DBA. Мені було доручено перемістити всю схему між двома базами даних, тому, не маючи DBA, мені довелося це робити і виконувати сценарії, не маючи можливості користуватися графічним інтерфейсом у SQL Server 2008, оскільки у мене не було прав адміністратора.
Все було переміщено без проблем, проте, запустивши збережену процедуру на новому schema.table, я виявив, що втратив поле ідентичності в таблиці. Я двічі перевірив сценарій, який створив таблицю, і він там був, однак, SQL Server не отримав цього, коли я запустив сценарій. Пізніше мені DBA повідомили, що він бачив цю саму проблему і раніше.
У будь-якому випадку, для SQL Server 2008 це кроки, які я вжив, щоб вирішити це питання, і вони спрацювали, тому я публікую це тут, сподіваючись, що це допоможе комусь. Це те, що я зробив, коли мав залежності від ФК щодо іншої таблиці, яка ускладнювала це:
Я використовував цей запит, щоб перевірити, чи справді ідентичність відсутня, і щоб переглянути залежності від таблиці.
1.) Знайдіть статистику на таблиці:
exec sp_help 'dbo.table_name_old';
2.) Створіть повторювану ідентичну нову таблицю, за винятком додавання поля ідентичності в поле PK, де воно було раніше.
3.) Вимкніть особи для переміщення даних.
SET IDENTITY_INSERT dbo.table_name ON
4.) Передача даних.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Перевірте, чи є дані.
SELECT * FROM dbo.table_name_new
6.) Повторно ввімкніть особу.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) Це найкращий сценарій, який я знайшов, щоб отримати всі відносини FK, щоб перевірити, яку таблицю (-и) оригінальна таблиця посилається на залежність, і я натрапив на багатьох, тож він є хранителем!
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
ORDER BY ReferenceTableName;
8.) Перед цим наступним кроком переконайтеся, що у вас є всі сценарії PK та FK для всіх залучених таблиць.
9.) Можна клацнути правою кнопкою миші на кожній клавіші та скриптувати це за допомогою SQL Server 2008
10.) Викиньте FK (s) з таблиці (ів) залежності, використовуючи цей синтаксис:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Опустіть оригінальну таблицю:
DROP TABLE dbo.table_name_old;
13.) Наступні кроки покладаються на сценарії, створені у SQL Server 2008 на кроці 9.
--Додайте ПК до нової таблиці.
--Додайте FK до нової таблиці.
--Додайте спинку FK до таблиці залежностей.
14.) Перевірте, чи все правильно і повно. Я використовував графічний інтерфейс для перегляду таблиць.
15.) Перейменуйте нову таблицю в назву оригінальної таблиці.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Нарешті, все спрацювало!