SSRS 2008 R2 後引入 Report Builder 3.0,加上傳統 BIDS/SSDT,報表可在本地、伺服器端雙工具編輯,且 Report Builder 缺乏版控整合,導致版本管理極度困難。
在 ReportServer 資料庫建立版本儲存表 + `INSERT/UPDATE` 觸發器,自動記錄報表定義(RDL)變更:
-- 版本儲存表
CREATE TABLE [dbo].[VersionStore] (
[VersionItemId] BIGINT IDENTITY(1,1) PRIMARY KEY,
[ItemId] UNIQUEIDENTIFIER NOT NULL,
[Name] NVARCHAR(425) NOT NULL,
[ModifiedDate] DATETIME NOT NULL,
[ModifiedBy] NVARCHAR(50),
[InsertedDate] DATETIME NOT NULL,
[Def] XML NULL
);
-- 觸發器
ALTER TRIGGER StoreVersion ON dbo.Catalog
FOR INSERT, UPDATE
AS
BEGIN
INSERT INTO ReportServer.dbo.VersionStore (ItemId, Name, ModifiedDate, ModifiedBy, InsertedDate, Def)
SELECT
C.ItemId, C.[Name], C.ModifiedDate, U.UserName, GETDATE(),
CONVERT(XML, CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), CONTENT)))
FROM Catalog C
INNER JOIN Users U ON U.UserID = C.ModifiedByID
WHERE C.Content IS NOT NULL
AND C.Type != 3
AND C.ItemID IN (
SELECT C2.ItemID FROM Catalog C2
LEFT OUTER JOIN (
SELECT V1.ItemID, MAX(V1.ModifiedDate) AS ModifiedDate
FROM VersionStore V1 GROUP BY V1.ItemID
) V ON C2.ItemID = V.ItemID
WHERE C2.Content IS NOT NULL
AND (V.ItemID IS NULL OR V.ModifiedDate != C2.ModifiedDate)
);
END;
此機制完整保留每次發佈/修改的 RDL 內容,支援隨時回溯。