Có cách nào dễ dàng hơn để giải quyết sự không phù hợp đối chiếu SQL Server / cơ sở dữ liệu so với thay đổi mỗi cột không?


8

TUYÊN BỐ TỪ CHỐI: Tôi biết rằng câu hỏi này đã được hỏi hàng trăm lần trước đây, nhưng tôi chỉ muốn kiểm tra xem có giải pháp nào dễ dàng hơn mà tôi có thể đã bỏ lỡ trước khi tôi tiếp tục và viết / lấy rất nhiều mã để thực hiện.

Phần mềm của chúng tôi sử dụng cơ sở dữ liệu ban đầu được thiết kế cho SQL Server 7 và do đó, tất cả các tập lệnh tạo ra nó không chỉ định bất kỳ đối chiếu rõ ràng nào cho bất kỳ cột ký tự nào. Thay vào đó, khi cơ sở dữ liệu được tạo / khôi phục thành SQL Server 2000 trở lên, mọi cột đều kế thừa đối chiếu cơ sở dữ liệu (điều này xảy ra SQL_Latin1_General_CP1_CI_ASdo đó là mặc định của SQL Server 7).

Về mặt lý thuyết, điều này sẽ không quá quan trọng, vì nếu cơ sở dữ liệu của chúng tôi được tạo từ đầu trên máy chủ của khách hàng, nó sẽ thừa hưởng đối chiếu máy chủ của khách hàng (thường là mặc định cài đặt hiện đại Latin1_General_CP1_CI_AS) và mọi thứ chỉ hoạt động. Tuy nhiên, kịch bản này bị hỏng khi họ gửi cho chúng tôi bản sao lưu cơ sở dữ liệu hoặc chúng tôi gửi cho họ bản sao lưu cơ sở dữ liệu và chúng tôi hoặc họ gặp lỗi không khớp đối xứng đáng sợ mỗi khi mã cố truy cập vào bảng tạm thời, v.v.

Chúng tôi đã cố gắng giáo dục khách hàng cài đặt hoặc xây dựng lại các phiên bản SQL Server của họ để sử dụng đối chiếu ưa thích của chúng tôi, nhưng tất nhiên điều đó không luôn xảy ra và không phải lúc nào cũng có thể.

Các giải pháp liên quan đến việc tạo cơ sở dữ liệu mới và sao chép dữ liệu không thực sự thiết thực đối với chúng tôi, chúng tôi cần một "cây đũa thần" mà chúng tôi có thể vẫy tại cơ sở dữ liệu trực tiếp để sửa tất cả các cột tại chỗ mà không làm phiền dữ liệu. Tôi đang suy nghĩ về việc viết một tiện ích để làm điều này, nhưng vì nó sẽ là một công việc khá lớn, có ai có bất kỳ đề xuất đơn giản hơn không?

Câu trả lời:


6

Một tùy chọn là "chứng minh" mã của bạn chống lại sự không khớp đối chiếu.

Bạn có thể sử dụng đối chiếu đặc biệt "DATABASE_DEFAULT" để ép buộc mà không cần biết đối chiếu thực tế là gì. Bạn sử dụng nó trên các cột kiểu char trong bảng tạm thời, biến bảng và bảng hệ thống bạn cần sử dụng.

Thí dụ:

CREATE TABLE #Currency (CCY CHAR(3))
GO
INSERT #Currency VALUES ('GBP')
INSERT #Currency VALUES ('CHF')
INSERT #Currency VALUES ('EUR')
GO
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --error!
GO
-- in join too
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY COLLATE DATABASE_DEFAULT --no error
GO
DROP TABLE #Currency
GO


CREATE TABLE  #Currency (CCY CHAR(3) COLLATE DATABASE_DEFAULT)
GO
INSERT #Currency VALUES ('GBP')
INSERT #Currency VALUES ('CHF')
INSERT #Currency VALUES ('EUR')
GO
SELECT Something
FROM myTable M JOIN #Currency C ON M.CCY = C.CCY --no error!
GO

DROP TABLE #Currency
GO

Điều này cũng có nghĩa là khi khách hàng của bạn di chuyển DB của họ sang hộp SQL Server mới, với một đối chiếu khác, nó cũng hoạt động ...


2

Câu trả lời ngắn gọn là không có một cách dễ dàng. Tôi đã có cùng một vấn đề trong quá khứ.

Điều tôi muốn nói là 2 điều, đầu tiên khi khách hàng của bạn gửi cho bạn một cơ sở dữ liệu có đối chiếu bất ngờ, cài đặt một phiên bản SQL mới với đối chiếu mặc định phù hợp với DB của họ và hoạt động với nó trong đó.

Thứ hai là đảm bảo ứng dụng của bạn sẽ hoạt động với các đối chiếu khác sau đó mặc định (vì chúng có thể thay đổi trong tương lai) và hoạt động chính xác miễn là đối chiếu trên máy chủ SQL và DB khớp. Sau đó, khá dễ dàng để khách hàng cài đặt máy chủ SQL với đối chiếu khớp với DB của họ và sau đó sẽ hoạt động.

Hoặc viết một tiện ích sẽ cập nhật tất cả các bảng, v.v. trong cơ sở dữ liệu của bạn như bạn đã nói, nhưng đó có thể là công việc nhiều hơn bạn muốn.


2

Nếu tất cả các cột trong cơ sở dữ liệu có cùng đối chiếu thì nó sẽ chỉ gây ra sự cố cho bạn khi thực hiện truy vấn cơ sở dữ liệu chéo (hoặc ứng dụng của bạn có độ nhạy theo thứ tự).

Điểm dính đến khi bạn nhận ra rằng việc tham gia vào các bảng tạm thời là cơ sở dữ liệu chéo, vì chúng nằm trong tempdb. Điều đó rất dễ sắp xếp - chỉ cần đảm bảo hơn bất kỳ cột văn bản nào trong các bảng tạm thời được tạo rõ ràng bằng lệnh COLLATE database_default. Điều này có nghĩa là cột sẽ được tạo với đối chiếu mặc định của cơ sở dữ liệu hiện tại thay vì bộ sưu tập mặc định của tempdb (sẽ giống với mặc định của máy chủ).

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.