Reporting Service(SSRS)有個訂閱功能,允許針對特定報表指定查詢參數、收件對象以及排程時間,建立訂閱(Subscription)後可定期用電子郵件寄日報表、週報表給相關人員,十分方便。
接獲報案,某張日報表設有兩個訂閱,每天先發預覽版給檢核人員,方便有錯緊急更正,15分鐘後再發正式版給長官。遇到狀況為預覽版正確寄出,正式版的訂閱項目執行狀況呈現 PENDING,收件者未收到信件。
找到 SSRS Log(%programfiles%\Microsoft SQL Server\<SQL Server Instance>\Reporting Services\LogFiles),查到寄送正式版訂閱時有存取被拒錯誤,訊息裡出現某個離職同事的 AD 帳號。推敲原因是建立該訂閱的同事離職,擁有者 AD 帳號失效,導致訂閱無法執行。但有點很可疑,AD 理在上個月底失效,訂閱仍正常跑了十來天。
有趣的是,SSRS 的訂閱管理介面查不到導致 PENDING 的原因(SQLAgent,看不出訂閱的擁有者是誰,也無從修改。被迫直接查詢 SSRS 資料庫,由 dbo.Subscriptions 查出該訂閱的 OwnerID,比對 dbo.Users UserID,證實正式版的 OwnerID 屬於職離同事,與預覽版 OwnerID 不同,這解釋兩個訂閱為何一個成功一個失敗。訂閱管理介面看不到也無法修改擁有者,試著重新儲存訂閱則因擁有者 AD 帳號不存在而失敗,感覺換掉 Subscription.OwnerID 是最直覺有效的解法,但直接改資料又覺得毛毛的。
最後查到這篇 MSDN 部落格文章(情境類似,也提到 AD 失效幾天後才發作的現象),看到微軟的 RD 也這麼幹,我就放心了,Just Do It!
DECLARE @OldUserID uniqueidentifier
DECLARE @NewUserID uniqueidentifier
SELECT @OldUserID = UserID FROM dbo.Users WHERE UserName = 'DOMAINA\OldUser'
SELECT @NewUserID = UserID FROM dbo.Users WHERE UserName = 'DOMAINA\NewUser'
UPDATE dbo.Subscriptions SET OwnerID = @NewUserID WHERE OwnerID = @OldUserID