Cách thay đổi đối chiếu SQL Server


27

Làm cách nào tôi có thể thay đổi Đối chiếu mặc định SQL Server 2008 R2 Express cho toàn bộ máy chủ và cơ sở dữ liệu cụ thể?

Có cách nào để làm điều đó bằng giao diện trực quan của SQL Server Management Studio không? Trong cửa sổ Thuộc tính Máy chủ (và trong cửa sổ Thuộc tính Cơ sở dữ liệu tương ứng), thuộc tính này không có sẵn để chỉnh sửa.


2
Nếu bạn muốn thay đổi đối chiếu tất cả các cột trong cơ sở dữ liệu, hãy xem tập lệnh này . Tôi đã không thử nó, nhưng tôi đã tìm thấy nó cho một đồng nghiệp đang tìm cách làm điều đó.
Justin thân mến

2
Nếu bạn muốn thay đổi đối chiếu cơ sở dữ liệu, hãy xem công cụ này: codeproject.com/KB/database/ChangeCollation.aspx Nó hoạt động với SQL Server 2005 và 2008 và nó hoạt động tốt hơn so với các tập lệnh bạn có thể tìm thấy trên web
Erwin

Câu trả lời:


25

Vâng.

Bạn có thể thay đổi đối chiếu mặc định của SQL Server 2008 R2 thể hiện và cơ sở dữ liệu riêng lẻ, nhưng đây là một nhiệm vụ phức tạp.

Đáng buồn thay, không có tùy chọn trực quan để làm điều đó thông qua SSMS.

SQL Server 2008 hỗ trợ cài đặt các bộ sưu tập ở các cấp sau:

  • Máy chủ

  • Cơ sở dữ liệu

  • Cột

  • Biểu hiện

Cài đặt cài đặt mặc định được xác định bởi ngôn ngữ hệ thống Windows. Đối chiếu ở cấp độ máy chủ có thể được thay đổi trong khi thiết lập hoặc bằng cách thay đổi ngôn ngữ hệ thống Windows trước khi cài đặt. hơn...

Cài đặt và thay đổi đối chiếu máy chủ - SQL Server 2008

  • Đảm bảo rằng bạn có tất cả thông tin hoặc tập lệnh cần thiết để tạo lại cơ sở dữ liệu người dùng của bạn và tất cả các đối tượng trong đó.

  • Xuất tất cả dữ liệu của bạn bằng cách sử dụng một công cụ như bcp Utility. Để biết thêm thông tin, hãy xem Nhập và Xuất Dữ liệu Hàng loạt.

  • Bỏ tất cả các cơ sở dữ liệu người dùng.

  • Xây dựng lại cơ sở dữ liệu chủ chỉ định đối chiếu mới trong thuộc tính SQLCOLLATION của lệnh thiết lập

  • Tạo tất cả các cơ sở dữ liệu và tất cả các đối tượng trong đó.

  • Nhập tất cả dữ liệu của bạn.

Cài đặt và thay đổi đối chiếu cơ sở dữ liệu - SQL Server 2008

  • Đặt COLLATIONtùy chọn trong CREATE DATABASEcâu lệnh trong khi tạo cơ sở dữ liệu mới.
  • Tương tự, đặt các COLLATIONtùy chọn trong ALTER DATABASEcâu lệnh để thay đổi đối chiếu cơ sở dữ liệu hiện có.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Cài đặt và thay đổi đối chiếu cột

  • Một số đối chiếu cột sẽ giữ nguyên ngay cả sau khi bạn thay đổi đối chiếu cơ sở dữ liệu. Trong trường hợp đó, bạn phải sửa đổi đối chiếu các cột riêng lẻ.

6

Hãy chắc chắn rằng bạn thực sự muốn "thả" cơ sở dữ liệu người dùng như đã lưu ý trong câu trả lời ở trên. Bạn có thể chỉ muốn "tách" cơ sở dữ liệu. Hoặc thực sự, bạn không thể làm gì khi xây dựng lại bản gốc một cách hiệu quả loại bỏ bất kỳ liên kết nào đến cơ sở dữ liệu người dùng. Đôi khi cơ sở dữ liệu được tạo trong đối chiếu mong muốn nhưng máy chủ thì không. Bạn sẽ không muốn khôi phục tất cả các cơ sở dữ liệu người dùng của mình từ các bản sao lưu trong trường hợp này.


5

Tôi đã làm một cái gì đó như thế này và nó đã hoạt động nhưng bạn phải ghi nhớ các chỉ mục đang trỏ đến kiểu dữ liệu là văn bản / varchar / nvarchar phải được loại bỏ, chạy tập lệnh và sau đó tạo các chỉ mục.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

đây là câu trả lời đầu tiên của tôi được đăng lên xin lỗi


-1

Xuất tất cả dữ liệu (bao gồm thông tin đăng nhập, máy chủ được liên kết, công việc Tác nhân SQL, cài đặt Thư DB, v.v.) xây dựng lại dữ liệu cấp cá thể, cộng với tải lại tất cả dữ liệu người dùng, rất nhiều công việc. Và, ngay cả sau khi tất cả điều đó, bạn vẫn có gì bảo đảm rằng bạn có thể cập nhật collation mặc định của một cơ sở dữ liệu thông qua ALTER DATABASEbởi vì có một số điều kiện mà sẽ ngăn chặn các hoạt động từ hoàn thành (xin vui lòng xem "Thay đổi cơ sở dữ liệu Collation" của ALTER DATABASEtài liệu để biết chi tiết) .

Tuy nhiên, có một phương pháp không có giấy tờ dễ dàng hơn nhiều . Hạn chế chính là nó không được hỗ trợ. Điều này không có nghĩa là mọi thứ sẽ sai, chỉ là nếu có gì đó, Microsoft sẽ không giúp sửa nó (vì họ không bao giờ đảm bảo rằng nó sẽ hoạt động).

Phương pháp tôi nói đến là chạy sqlservr.exevới công -q {new_collation_name}tắc. Có nhiều hơn một chút so với điều đó, nhưng đó là ý tưởng cơ bản. Phương pháp này chỉ đơn giản là cập nhật siêu dữ liệu hệ thống, có lợi ích và hậu quả, những vấn đề chính là:

LỢI ÍCH

  • khá nhanh
  • bỏ qua hầu hết các hạn chế ngăn cản ALTER DATABASElàm việc
  • có khả năng chính xác hơn nhiều so với bất kỳ tập lệnh nào mà mọi người nghĩ ra trong nhiều năm qua để thả và tái tạo các đối tượng

VÒI

  • không được hỗ trợ nếu có sự cố
  • VARCHARdữ liệu có thể thay đổi, NẾU trang mã khác nhau giữa các bộ sưu tập cũ và mới và các ký tự có giá trị 128 - 255 (0x80 - 0xFF) tồn tại các ký tự đó không tồn tại dưới cùng một ký tự có cùng giá trị trên mã mới trang. Vì vậy, tiềm năng là mất dữ liệu và dữ liệu của bạn cần được nghiên cứu trước để đảm bảo rằng điều kiện này không tồn tại. Nhưng, điều này cũng có nghĩa là có rất nhiều trường hợp chỉ có các ký tự có giá trị 0 - 127 không gây nguy hiểm, ngay cả khi trang mã thay đổi.
  • Các loại bảng do người dùng xác định (UDTT) được bỏ qua và cần được cập nhật thủ công.

Để biết mô tả chi tiết về những gì sqlservr.exe -qphương pháp làm và không làm (bao gồm chi tiết về cách thức hoạt động của các bộ sưu tập ở các cấp độ khác nhau và các vấn đề tiềm ẩn cần chú ý), vui lòng xem bài đăng của tôi:

Thay đổi đối chiếu của trường hợp, cơ sở dữ liệu và tất cả các cột trong tất cả các cơ sở dữ liệu người dùng: Điều gì có thể xảy ra sai?

Để thay đổi chỉ dụ (bao gồm cả cơ sở dữ liệu hệ thống: master, model, msdb, và tempdb) và một hoặc nhiều cơ sở dữ liệu (nhưng không phải tất cả các cơ sở dữ liệu), chỉ cần tách cơ sở dữ liệu (s) mà bạn muốn loại trừ từ hoạt động này, và sau đó lại đính kèm chúng khi cập nhật đối chiếu hoàn tất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.