2012-05-25 26 views
14

Tôi đang cố gắng phát triển trình kích hoạt thư. Ai đó có thể hỗ trợ về cách thức này có thể đạt được để khi sử dụng chèn một bản ghi nó kiểm tra trường "tốc độ" sao cho khi giá trị được chèn vượt quá 100, một thư được gửi đến địa chỉ được chỉ định.Gửi e-mail từ trình kích hoạt

+0

Bạn cũng cần phải GRANT EXECUTE cho người dùng cho msdb.dbo.sp_send_dbmail nếu nó đang chạy trong ứng dụng chẳng hạn. – smoore4

Trả lời

37

Trước tiên, bạn cần phải thiết lập cơ sở dữ liệu email - nếu bạn đã không làm như vậy, câu hỏi này có thể giúp:

Sau đó, bạn cần kích hoạt:

CREATE TRIGGER dbo.whatever 
ON dbo.wherever 
FOR INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100) 
    BEGIN 
     EXEC msdb.dbo.sp_send_dbmail 
      @recipients = '[email protected]', 
      @profile_name = 'default', 
      @subject = 'Someone was speeding', 
      @body = 'Yep, they sure were.'; 
    END 
END 
GO 

Bây giờ, có thể bạn sẽ nói rằng bạn muốn dữ liệu từ chèn được thực sự được bao gồm trong e-mail. Và độ nghiêng đầu tiên của bạn là khai báo một số biến cục bộ và gán chúng từ inserted - điều này không có tác dụng vì trình kích hoạt của bạn có thể phản hồi với chèn nhiều hàng. Vì vậy, đúng cách để làm điều này là:

CREATE TRIGGER dbo.whatever 
ON dbo.wherever 
FOR INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @body NVARCHAR(MAX) = N''; 

    SELECT @body += CHAR(13) + CHAR(10) + RTRIM(some_col) FROM inserted; 

    IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100) 
    BEGIN 
     EXEC msdb.dbo.sp_send_dbmail 
      @recipients = '[email protected]', 
      @profile_name = 'default', 
      @subject = 'At least one person was speeding', 
      @body = @body; 
    END 
END 
GO 

Điều đó tất cả đã nói, tôi không phải là người hâm mộ lớn gửi e-mail từ trình kích hoạt. Mặc dù thư cơ sở dữ liệu sử dụng dịch vụ môi giới và vì vậy là không đồng bộ, tôi sẽ có khuynh hướng điền vào một bảng xếp hàng và có một chuỗi nền đi xung quanh và gửi tất cả các e-mail thích hợp. Các hai ba điều tốt đẹp về vấn đề này là:

  1. bạn giảm thiểu sự chậm trễ tiềm năng trong phạm giao dịch bên ngoài mà bắn cò - những phức tạp hơn logic của bạn trong cò, càng chậm bạn thực hiện quá trình đó.
  2. vì có lẽ không cần thiết phải gửi e-mail đến hàng nghìn giây, bạn có thể dễ dàng biến động thời gian của quá trình nền - điều này tránh phải kiểm tra bảng rất nhỏ, cả ngày, khi rất ít nhiều lần nó sẽ phải thực sự làm bất cứ điều gì.
  3. Như @goodeye đã chỉ ra, việc giữ riêng quy trình này có thể ngăn lỗi trong phần email của quá trình can thiệp vào DML gốc (trong trường hợp của chúng, tham số không hợp lệ là sp_send_dbmail - mà tôi đã vô tình đề xuất)).
+0

Cảm ơn phản hồi. Làm cách nào để thiết lập thư cơ sở dữ liệu. –

+1

+1 cho 'Vâng, họ chắc chắn là.' – JNK

+0

Cảm ơn. Giải pháp của bạn hoạt động tốt –