首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SSRS 報表版本控制實作:自建版本儲存與觸發器機制

     編輯:關於SqlServer

痛點:雙工具並存導致版控失效

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 內容,支援隨時回溯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved