Tôi là một nhà phát triển java tình cờ tham gia vào một nhóm không có DBA và là một nhà phát triển, tôi không thể có quyền DBA. Tôi được giao nhiệm vụ di chuyển toàn bộ lược đồ giữa hai cơ sở dữ liệu, vì vậy không có DBA, tôi phải thực hiện và thực hiện bằng cách chạy các tập lệnh, không thể sử dụng GUI trong SQL Server 2008 vì tôi không có quyền quản trị viên.
Mọi thứ đã được di chuyển mà không có vấn đề, tuy nhiên, khi chạy một thủ tục được lưu trữ trên lược đồ mới. Tôi thấy tôi bị mất trường nhận dạng trong một bảng. Tôi đã kiểm tra lại tập lệnh đã tạo bảng và nó đã ở đó, tuy nhiên, SQL Server đã không nhận được tập lệnh này khi tôi chạy tập lệnh. Sau đó tôi đã được một DBA nói rằng anh ta đã thấy vấn đề tương tự trước đây.
Trong mọi trường hợp, đối với SQL Server 2008, đây là các bước tôi đã thực hiện để giải quyết vấn đề này và chúng đã hoạt động, vì vậy tôi sẽ đăng bài này lên đây với hy vọng nó sẽ giúp ích cho ai đó. Đây là những gì tôi đã làm khi tôi có các phụ thuộc FK trên một bảng khác khiến việc này trở nên khó khăn hơn:
Tôi đã sử dụng truy vấn này để xác minh danh tính thực sự bị thiếu và để xem các phụ thuộc trên bảng.
1.) Tìm số liệu thống kê trên bảng:
exec sp_help 'dbo.table_name_old';
2.) Tạo một bảng mới trùng lặp, giống hệt nhau, ngoại trừ thêm một trường nhận dạng trên trường PK nơi nó đã có trước đó.
3.) Vô hiệu hóa danh tính để di chuyển dữ liệu.
SET IDENTITY_INSERT dbo.table_name ON
4.) Chuyển dữ liệu.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Xác minh dữ liệu ở đó.
SELECT * FROM dbo.table_name_new
6.) Kích hoạt lại danh tính.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) Đây là tập lệnh tốt nhất tôi tìm thấy để có được tất cả các mối quan hệ FK để xác minh (các) bảng nào tham chiếu bảng gốc là phụ thuộc và tôi đã gặp nhiều người, vì vậy đó là một người giữ!
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.) Đảm bảo rằng bạn có tất cả các tập lệnh PK và FK cho tất cả các bảng có liên quan, trước bước tiếp theo này.
9.) Bạn có thể nhấp chuột phải vào từng khóa và tập lệnh này bằng SQL Server 2008
10.) Thả FK (s) từ (các) bảng phụ thuộc bằng cú pháp này:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Thả bảng gốc:
DROP TABLE dbo.table_name_old;
13.) Các bước tiếp theo này dựa trên các tập lệnh bạn đã tạo trong SQL Server 2008 trong bước 9.
--Thêm PK vào bảng mới.
--Thêm FK vào bảng mới.
--Thêm FK trở lại bảng phụ thuộc.
14.) Xác minh mọi thứ là chính xác và đầy đủ. Tôi đã sử dụng GUI để xem các bảng.
15.) Đổi tên bảng mới thành tên bảng gốc.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Cuối cùng, mọi thứ đã hoạt động!