2009-01-08 40 views
7

Tôi muốn viết một dịch vụ (có thể là trong C#) để theo dõi một bảng cơ sở dữ liệu. Khi một bản ghi được chèn vào bảng, tôi muốn dịch vụ lấy dữ liệu mới được chèn vào và thực hiện một số logic nghiệp vụ phức tạp với nó (quá phức tạp đối với TSQL).Trình kích hoạt SQL CLR có thể thực hiện việc này không? đây có phải là cách tốt hơn không?

Một tùy chọn là để dịch vụ định kỳ kiểm tra bảng để xem liệu các bản ghi mới đã được chèn chưa. Vấn đề với cách làm đó là tôi muốn dịch vụ biết về chèn ngay khi chúng xảy ra, và tôi không muốn giết hiệu năng cơ sở dữ liệu.

Thực hiện một nghiên cứu nhỏ, có vẻ như việc viết trình kích hoạt CLR có thể thực hiện công việc. Tôi có thể viết kích hoạt trong C# mà cháy khi một chèn xảy ra, và sau đó gửi dữ liệu mới được chèn vào một dịch vụ Windows hoặc WCF.

Bạn nghĩ gì, việc sử dụng trình kích hoạt SQL CLR tốt (hoặc thậm chí có thể)?

Bất kỳ ý tưởng nào khác về cách thực hiện điều này?

Trả lời

6

Có lẽ bạn nên bỏ bớt xử lý sau khi chèn:

Trong trình kích hoạt Chèn, thêm PK của bản ghi vào bảng xếp hàng.

Trong một dịch vụ riêng biệt, hãy đọc từ bảng xếp hàng và thực hiện thao tác phức tạp của bạn. Khi hoàn tất, đánh dấu bản ghi là đã xử lý (cùng với thông tin lỗi/trạng thái), hoặc xóa bản ghi khỏi hàng đợi.

+0

Chính xác những gì tôi định đề xuất. Nó sẽ được an toàn giao dịch và sẽ lưu giữ các bản ghi đã xử lý và chưa xử lý trong một bảng sẽ không ảnh hưởng đến các bảng ứng dụng chính. 1 cho giải pháp này! – evilhomer

+2

Sử dụng Nhà môi giới dịch vụ máy chủ SQL –

+0

Ý tưởng hay, ngoại trừ việc bạn mất tất cả dấu vết của nội dung đã thay đổi (tức là nội dung của bảng ĐÃ XÓA, chỉ có sẵn trong khi thực hiện trình kích hoạt). Phụ thuộc vào những gì bạn cần, tôi cho là vậy. –

3

Những gì bạn mô tả đôi khi được gọi là Hàng đợi công việc hoặc Hàng đợi tin nhắn. Có một số chủ đề về cách sử dụng một bảng DBMS (cũng như các kỹ thuật khác) để làm điều này mà bạn có thể tìm thấy bằng cách tìm kiếm.

Tôi sẽ xem xét việc làm bất cứ điều gì giống như vậy với Trình kích hoạt là một tính năng cơ sở dữ liệu không phù hợp dễ dàng gặp sự cố. Trình kích hoạt được sử dụng tốt nhất cho các chức năng cấu trúc dbms trên không thấp (ví dụ: kiểm tra tính toàn vẹn tham chiếu chi tiết) và cần phải có trọng lượng nhẹ và đồng bộ. Nó có thể được thực hiện, nhưng có lẽ sẽ không phải là một ý tưởng tốt.

1

Tôi có dịch vụ thăm dò ý kiến ​​cơ sở dữ liệu mỗi phút, nó không gây ra nhiều vấn đề về hiệu suất và đó là giải pháp sạch. Ngoài ra, nếu dịch vụ của bạn hoặc điểm cuối wcf khác không có trình kích hoạt của bạn sẽ bị lỗi hoặc bị mất và bạn sẽ phải thăm dò ý kiến ​​sau đó.

1

Tôi sẽ không khuyên bạn sử dụng trình kích hoạt CLR hoặc bất kỳ loại trình kích hoạt nào cho điều này. Bạn đang mở bản thân để có khả năng bảo trì nghiêm trọng và các vấn đề về khóa tiềm ẩn. (Trình kích hoạt rất đơn giản để chuyển đổi bảng kiểm tra/xếp hàng có thể chấp nhận được nếu bạn không quan tâm đến danh tính @@ sau khi chèn và bạn sẽ không bao giờ khóa bảng kiểm tra/xếp hàng)

Thay vào đó, từ ứng dụng của bạn/orm bạn nên kích hoạt chèn công cụ vào một bảng xếp hàng và có hàng đợi này được xử lý một cách thường xuyên. Điều này có thể được thực hiện bằng cách có một giao dịch trong ORM của bạn hoặc khởi động một proc được lưu trữ bắt đầu một giao dịch cam kết thay đổi và kiểm toán/xếp hàng một cách nguyên tử. (Cẩn thận với khóa ở đây)

Nếu bạn cần hành động ngay lập tức, nhìn vào đẻ trứng một công việc để xóa các hàng đợi sau khi bạn làm một chèn/cập nhật/xóa trên bàn và

Cũng chắc chắn rằng bạn đang kiểm tra đôi xếp hàng một lần hoặc lâu hơn trong trường hợp quá trình nền không được khởi động đúng cách. Nếu một ứng dụng web của nó và bạn muốn tránh các chủ đề sinh sản, bạn có thể giao tiếp với một quá trình nền để xóa hàng đợi.

-1

Tại sao không thực hiện chèn trong quy trình được lưu trữ và thực hiện logic nghiệp vụ trong quy trình sau khi chèn? Điều gì phức tạp đến mức nó không thể được viết trong T-SQL?

2

Tôi khuyên bạn nên kích hoạt trên bảng gọi số SQL Server Service Broker, sau đó (không đồng bộ) thực thi thủ tục được lưu trữ CLR thực hiện tất cả công việc của bạn trong một chuỗi khác.

+0

Đồng ý. Mã .net thậm chí không phải là một clr được lưu trữ proc - nó có thể tiêu thụ các nội dung hàng đợi từ một tiến trình khác. –

Các vấn đề liên quan