ฉันเป็นนักพัฒนา Java ที่เกิดขึ้นกับทีมโดยไม่มี DBA และเป็นที่หนึ่งในฐานะนักพัฒนาฉันไม่สามารถรับสิทธิ์ DBA ได้ ฉันถูกมอบหมายให้ย้ายสคีมาทั้งหมดระหว่างฐานข้อมูลสองแห่งดังนั้นโดยไม่ต้องมี DBA ฉันต้องทำและดำเนินการโดยเรียกใช้สคริปต์ไม่สามารถใช้ GUI ใน SQL Server 2008 ได้เนื่องจากฉันไม่มีสิทธิ์ของผู้ดูแลระบบ
ทุกอย่างถูกย้ายโดยไม่มีปัญหาอย่างไรก็ตามเมื่อเรียกใช้กระบวนงานที่เก็บไว้ใน schema.table ใหม่ฉันพบว่าฉันสูญเสียเขตข้อมูลระบุตัวตนในตาราง ฉันตรวจสอบสคริปต์ที่สร้างตารางอีกครั้งและอยู่ที่นั่น แต่ SQL Server ไม่ได้รับเมื่อรันสคริปต์ ฉันถูกบอกภายหลังโดย DBA ว่าเขาเคยเห็นปัญหาเดียวกันนี้มาก่อน
ไม่ว่าในกรณีใดสำหรับ SQL Server 2008 นี่คือขั้นตอนที่ฉันดำเนินการเพื่อแก้ไขปัญหานี้และทำงานได้ดังนั้นฉันจึงโพสต์สิ่งนี้ที่นี่โดยหวังว่าจะเป็นประโยชน์กับใครบางคน นี่คือสิ่งที่ฉันทำเพราะฉันมีการพึ่งพา FK ในตารางอื่นที่ทำให้สิ่งนี้ยากขึ้น:
ฉันใช้แบบสอบถามนี้เพื่อตรวจสอบตัวตนที่ขาดหายไปและเพื่อดูการอ้างอิงในตาราง
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
- เพิ่ม PK ไปยังตารางใหม่
- เพิ่ม FK ไปยังตารางใหม่
- เพิ่ม FK's กลับไปที่ตารางการพึ่งพา
14. ) ตรวจสอบว่าทุกอย่างถูกต้องและครบถ้วน ฉันใช้ GUI เพื่อดูตาราง
15. ) เปลี่ยนชื่อตารางใหม่เป็นชื่อตารางดั้งเดิม
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
ในที่สุดทุกอย่างทำงาน!