ฉันจะเปลี่ยนการจัดเรียงของฐานข้อมูลเซิร์ฟเวอร์ SQL ได้อย่างไร


16

ฉันพยายามสร้างมาตรฐานฐานข้อมูลทั้งหมดในการเปรียบเทียบครั้งเดียว - Latin1_General_CI_AS (การเปรียบเทียบแบบมาตรฐาน) ฉันมีฐานข้อมูลบางส่วนที่อยู่ใน SQL_Latin1_General_CP1_CI_AS

ฉันรู้ว่าฉันสามารถใช้ ALTER DATABASE เพื่อเปลี่ยนการจัดเรียงฐานข้อมูลได้ แต่มีผลกับวัตถุใหม่เท่านั้น ความเข้าใจของฉันคือวิธีเดียวที่จะเปลี่ยนคอลัมน์ที่มีอยู่คือทำ ALTER COLUMN ในแต่ละคอลัมน์ในทุกตาราง - และฉันจะต้องวางและสร้างดัชนีทั้งหมดใหม่เพื่อทำสิ่งนั้น

ฉันเดาว่ามันจะเป็นแบบนี้:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

และทำซ้ำสำหรับทุกคอลัมน์ varchar, char, text, nvarchar, nchar และ ntext ในฐานข้อมูลทั้งหมด นั่นจะเป็นสคริปต์ SQL ขนาดใหญ่

มีวิธีที่ง่ายกว่าในการทำเช่นนี้หรือใครสามารถแนะนำวิธีการสร้างสคริปต์ SQL เพื่อทำมันได้โดยอัตโนมัติหรือไม่

คำตอบ:


9

MS KB 325335มีตัวเลือกในการทำเช่นนี้สำหรับฐานข้อมูลทั้งหมดและคอลัมน์ทั้งหมด

โดยทั่วไป:

  1. ตารางฐานข้อมูลสคริปต์ (พร้อมการจัดเรียงใหม่)
  2. ข้อมูล DTS / SSIS (ดูการเปรียบเทียบ)
  3. เพิ่มข้อ จำกัด


2

น่าเสียดายที่นี่ไม่ใช่งานง่ายใน SQL Server

คุณสามารถใช้เครื่องมือการเขียนสคริปต์เช่นการเปรียบเทียบ SQL ของ Redgate สำหรับวัตถุฐานข้อมูลที่มีอยู่ (ตารางขั้นตอนการจัดเก็บมุมมองและอื่น ๆ ) หากคุณไม่มีใบอนุญาตคุณสามารถทดลองใช้ฟรีได้ หลังจากคุณสร้างฐานข้อมูลใหม่ด้วยการจัดเรียงที่ถูกต้องและสร้างวัตถุใหม่จากสคริปต์ของคุณคุณสามารถเรียกใช้ SSIS เพื่อถ่ายโอนข้อมูลจากฐานข้อมูลหนึ่งไปยังอีกฐานข้อมูลหนึ่ง หากคุณมีข้อมูลจำนวนมากให้ใช้การแทรกจำนวนมากของ T-SQL

สำหรับการจัดเรียงที่ถูกต้องสำหรับฐานข้อมูลในอนาคตบนเซิร์ฟเวอร์นั้นคุณสามารถเปลี่ยนการจัดเรียงเริ่มต้นบนเซิร์ฟเวอร์ บทความ MSDN ต่อไปนี้อธิบายถึงการเปลี่ยนแปลงที่ใช้ส่วนคำสั่ง COLLATE ของ ALTER DATABASE และ ALTER TABLE:

การตั้งค่าและการเปลี่ยนแปลงการจัดเรียงฐานข้อมูล (SQL Server 2008 Books Online)

คุณสามารถเปลี่ยนการเปรียบเทียบของวัตถุใหม่ใด ๆ ที่ถูกสร้างขึ้นในฐานข้อมูลผู้ใช้โดยใช้ประโยคเรียงของเปลี่ยนแปลงฐานข้อมูลคำสั่ง คำสั่งนี้จะไม่เปลี่ยนการเรียงของคอลัมน์ในตารางที่ผู้ใช้กำหนดเองที่มีอยู่ เหล่านี้สามารถเปลี่ยนแปลงได้โดยใช้คำสั่งของ COLLATE เปลี่ยนแปลงตาราง

เมื่อคุณเปลี่ยนการเปรียบเทียบฐานข้อมูลคุณเปลี่ยนสิ่งต่อไปนี้:

  • การเปรียบเทียบค่าเริ่มต้นสำหรับฐานข้อมูล การเปรียบเทียบค่าเริ่มต้นใหม่นี้จะนำไปใช้กับคอลัมน์ทั้งหมดชนิดข้อมูลที่ผู้ใช้กำหนดตัวแปรและพารามิเตอร์ที่สร้างขึ้นในฐานข้อมูลในภายหลัง นอกจากนี้ยังใช้เมื่อแก้ไขตัวระบุวัตถุที่ระบุในคำสั่ง SQL กับวัตถุที่กำหนดในฐานข้อมูล
  • คอลัมน์ char, varchar, text, nchar, nvarchar หรือ ntext ใด ๆ ในตารางระบบจะถูกเปลี่ยนเป็นการจัดเรียงใหม่
  • พารามิเตอร์ char, varchar, text, nchar, nvarchar หรือ ntext ที่มีอยู่ทั้งหมดและค่าส่งคืนสเกลาร์สำหรับโพรซีเดอร์ที่เก็บไว้และฟังก์ชันที่ผู้ใช้กำหนดจะเปลี่ยนเป็นการจัดเรียงใหม่
  • ชนิดข้อมูลระบบ char, varchar, text, nchar, nvarchar หรือ ntext และชนิดข้อมูลที่ผู้ใช้กำหนดเองทั้งหมดตามชนิดข้อมูลระบบเหล่านี้จะถูกเปลี่ยนเป็นการจัดเรียงเริ่มต้นใหม่

1

โดยทั่วไปไม่แนะนำให้ทำเช่นนี้กับเซิร์ฟเวอร์ที่ใช้งานจริง ครั้งสุดท้ายที่ฉันดูการทำเช่นนี้ไม่ได้รับการสนับสนุนอย่างเป็นทางการจาก Microsoft เมื่อต้องการทำสิ่งนี้ในทางปฏิบัติคุณต้องสร้างอินสแตนซ์ใหม่ด้วยการเปรียบเทียบที่ถูกต้องและย้ายฐานข้อมูลไป

การคืนค่าฐานข้อมูลด้วยไปยังเซิร์ฟเวอร์ที่มีการเปรียบเทียบค่าเริ่มต้นที่แตกต่างกันทำให้เกิดความสนุกทุกประเภทเนื่องจาก tempdb จะมีการเปรียบเทียบของเซิร์ฟเวอร์ใหม่ดังนั้นจึงไม่แนะนำให้ทำเช่นนี้


1

ลองใช้ยูทิลิตี้นี้ที่กำหนดให้ฐานข้อมูลต้นฉบับจะสร้างสคริปต์ทั้งหมดที่จำเป็นต้องใช้กับฐานข้อมูลเป้าหมายเพื่อให้การเปรียบเทียบมีการเปลี่ยนแปลงอย่างปลอดภัย


1

คุณสามารถใช้มุมมอง Infomation_Schema เพื่อสร้างสคริปต์ได้ง่ายพอ แต่ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดในการแก้ปัญหาของคุณ การสร้างดัชนีทั้งหมดใหม่บนฐานข้อมูลขนาดใหญ่อาจใช้เวลา / พื้นที่บันทึกจำนวนมหาศาล ฯลฯ ฉันจะย้ายข้อมูล (ไม่คืนค่า) ไปยังอินสแตนซ์ใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.