Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để thông báo cho một dịch vụ windows (c #) về Thay đổi bảng DB (sql 2005)?

Bạn thực sự không có nhiều cách để phát hiện các thay đổi trong SQL 2005. Bạn đã liệt kê hầu hết chúng.

Thông báo truy vấn . Đây là công nghệ hỗ trợ SqlDependency và các dẫn xuất của nó, bạn có thể đọc thêm chi tiết trên Thông báo bí ẩn . Nhưng QN được thiết kế để làm mất hiệu lực kết quả, không chủ động thông báo nội dung thay đổi. Bạn sẽ chỉ biết rằng bảng có những thay đổi, mà không biết những gì đã thay đổi. Trên một hệ thống bận rộn, điều này sẽ không hoạt động, vì các thông báo sẽ đến liên tục.

Đọc nhật ký . Đây là cách sử dụng sao chép giao dịch và là cách ít xâm phạm nhất để phát hiện các thay đổi. Thật không may là chỉ có sẵn cho các thành phần bên trong. Ngay cả khi bạn quản lý để hiểu định dạng nhật ký, vấn đề là bạn cần hỗ trợ từ công cụ để đánh dấu nhật ký là 'đang sử dụng' cho đến khi bạn đọc nó, hoặc nó có thể bị ghi đè. Chỉ sao chép giao dịch mới có thể thực hiện loại đánh dấu đặc biệt này.

So sánh dữ liệu . Dựa vào cột dấu thời gian để phát hiện các thay đổi. Cũng dựa trên kéo, khá xâm nhập và có vấn đề khi phát hiện xóa.

Lớp ứng dụng . Đây là tùy chọn tốt nhất về lý thuyết, trừ khi có những thay đổi xảy ra đối với dữ liệu bên ngoài phạm vi của ứng dụng, trong trường hợp đó, nó sẽ sụp đổ. Trong thực tế, có luôn luôn các thay đổi xảy ra bên ngoài phạm vi ứng dụng.

Trình kích hoạt . Cuối cùng, đây là lựa chọn khả thi duy nhất. Tất cả các cơ chế thay đổi dựa trên trình kích hoạt hoạt động theo cùng một cách, chúng sắp xếp thông báo thay đổi đến một thành phần giám sát hàng đợi.

Luôn có các đề xuất để thực hiện một thông báo đồng bộ, được kết hợp chặt chẽ (thông qua xp_cmdshell, xp_olecreate, CLR, thông báo với WCF, bạn đặt tên cho nó), nhưng tất cả các lược đồ này đều thất bại trong thực tế vì chúng có sai sót cơ bản:
- chúng không tài khoản cho tính nhất quán của giao dịch và số lần khôi phục
- chúng đưa ra các phụ thuộc vào tính khả dụng (hệ thống OLTP không thể tiếp tục trừ khi thành phần được thông báo trực tuyến)
- chúng hoạt động khủng khiếp vì mỗi hoạt động DML phải đợi lệnh gọi RPC ở một số dạng để hoàn thành

Nếu trình kích hoạt không thực sự chủ động thông báo cho người nghe, mà chỉ xếp hàng các thông báo, thì có vấn đề trong việc theo dõi hàng đợi thông báo (khi tôi nói 'hàng đợi', ý tôi là bất kỳ bảng nào hoạt động như một hàng đợi). Giám sát ngụ ý kéo các mục nhập mới trong hàng đợi, có nghĩa là cân bằng tần suất kiểm tra một cách chính xác với tải thay đổi và phản ứng với mức tăng đột biến của tải. Điều này không hề tầm thường chút nào, thực sự là rất khó. Tuy nhiên, có một câu lệnh trong máy chủ SQL có ngữ nghĩa để chặn, không cần kéo, cho đến khi có thay đổi: CHỜ (NHẬN) . Điều đó có nghĩa là Nhà môi giới dịch vụ. Bạn đã đề cập đến SSB nhiều lần trong bài đăng của mình, nhưng bạn thực sự sợ hãi khi triển khai nó vì chưa biết nhiều. Nhưng thực tế là cho đến nay, nó là phù hợp nhất cho nhiệm vụ bạn đã mô tả.

Bạn không phải triển khai kiến ​​trúc SSB đầy đủ, nơi thông báo được gửi đến dịch vụ từ xa (dù sao thì điều đó cũng yêu cầu phiên bản SQL từ xa, thậm chí là phiên bản Express). Tất cả những gì bạn cần làm là tách thời điểm phát hiện thay đổi (trình kích hoạt DML) từ thời điểm thông báo được gửi (sau khi thay đổi được cam kết). Đối với điều này, tất cả những gì bạn cần là hàng đợi và dịch vụ SSB cục bộ. Trong trình kích hoạt, bạn GỬI một thông báo thay đổi cho dịch vụ địa phương. Sau khi cam kết giao dịch DML ban đầu, quy trình dịch vụ kích hoạt và gửi thông báo, chẳng hạn như sử dụng CLR. Bạn có thể xem ví dụ về điều gì đó tương tự như thế này tại T-SQL không đồng bộ .

Nếu bạn đi theo con đường đó, có một số thủ thuật bạn sẽ cần học để đạt được lưu lượng cao và bạn phải hiểu rõ khái niệm phân phối thư theo thứ tự trong SSB. Tôi khuyên bạn nên đọc các liên kết sau:

Về các phương tiện để phát hiện các thay đổi, SQL 2008 dường như thêm các tùy chọn mới: Thay đổi Theo dõi Thay đổi và Thu thập Dữ liệu . Tôi nhấn mạnh 'rõ ràng', vì chúng không thực sự là công nghệ mới. CDC sử dụng trình đọc nhật ký và dựa trên cơ chế sao chép Giao dịch hiện có. CT sử dụng các trình kích hoạt và rất giống với các cơ chế sao chép Hợp nhất hiện có. Cả hai đều nhằm mục đích thỉnh thoảng được kết nối hệ thống cần đồng bộ hóa và do đó không chấp thuận thông báo thay đổi theo thời gian thực. Họ có thể điền vào các bảng thay đổi, nhưng bạn còn nhiệm vụ theo dõi các bảng này để tìm các thay đổi, đó là chính xác từ nơi bạn bắt đầu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tsql trả về một bảng từ một hàm hoặc thủ tục lưu trữ

  2. Cách trả lại tất cả các ràng buộc kiểm tra không đáng tin cậy trong SQL Server (Ví dụ T-SQL)

  3. Có cách nào để lặp qua biến bảng trong TSQL mà không sử dụng con trỏ không?

  4. Cách tạo khóa chính tổng hợp trong SQL Server (Ví dụ T-SQL)

  5. Thay đổi cột bảng để chấp nhận thêm ký tự