程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SSRS的報表版本控制

SSRS的報表版本控制

編輯:關於SqlServer

問題

如今商務智能應用廣泛,對我們的商業愈加重要. 對新報表和的各種需求不斷攀升. 自 SQL Server 2008 R2的 Reporting Services (SSRS) 開始,微軟視圖為減輕IT團隊的工作量,推出了報表工具 Report Builder 3.0.  在此之前建立復雜的報表必須用BIDS (就是 Visual Studio ,2012以後叫SSDT).現在報表都可以用 BIDS或者Report Builder建立. 因為可以使用兩個工具創建修改的關系. 報表的版本控制愈加困難.

當報表只用BIDS創建的時候,版本控制非常簡單. 你隨便用哪個工具都可以搞定 .比如 TFS, SVN, 或者Git.  但是用Report Builder 就比較復雜了, 這個玩意沒集成任何版本控制系統. 此外Report Builder可以在服務端直接設計和保存 ,這個就使得版本控制更困難了.   Report Builder也可以存在本地.不過使用 共享數據集和數據源就有麻煩了.

為什麼要進行版本控制

版本控制系統( version control system (VCS)) 有很多好處. 最大的好處就是可以還原先前版本. 一個好的版本控制系統也可以讓你容易的查看版本的不同變化,meta-data等. 現在我們要同時用Report Builder和BIDS, 因此我們的版本控制不太容易了.

我找了很多資料,但是沒有搞定. 我看到一個解決方案是把 RDLs 導出到SVN . 我看到一個解決方案是,把 RDL文件放到SVN,然後把開發服務器上報表的每個變動記錄提交到VCS.不過解決方案和我的現有環境不匹配, 我們有些是用BIDS有些卻是用 Report Builder, 有些在本地文件系統,有些則是在報表服務器.

我的SSRS版本控制系統

因為沒找到適合的解決方案.我打算自己建立一個用來回復先前的版本.

這是一個非常簡單的系統 . 我就實現了服務器上報表的變更記錄 . 我在報表服務器數據庫中添加了一個表格,用來記錄報表的版本.(參見下面代碼) . 然後我在 數據庫上添加了  insert/update 觸發器 .

版本記錄表代碼:

USE ReportServer
go
CREATE TABLE [dbo].[VersionStore](
      [VersionItemId] [bigint] IDENTITY(1,1) NOT NULL,
      [ItemId] [uniqueidentifier] NOT NULL,
      [Name] [nvarchar](425) NOT NULL,
      [ModifiedDate] [datetime] NOT NULL,
      [ModifiedBy] nvarchar(50),
      [InsertedDate] [datetime] NOT NULL,
      [Def] [xml] NULL,
 CONSTRAINT [PK_VersionStore] PRIMARY KEY CLUSTERED
(
      [VersionItemId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

觸發器代碼:

USE ReportServer
go
ALTER TRIGGER StoreVersion ON dbo.Catalog
   FOR INSERT, UPDATE
AS
BEGIN
      INSERT INTO ReportServer.dbo.VersionStore
         ( ItemId
         ,Name
         ,ModifiedDate
         ,ModifiedBy
         ,InsertedDate
         ,Def
         )
         SELECT ItemId
              ,[Name]
              ,ModifiedDate
              ,u.UserName ModifiedBy
              ,GETDATE() InsertedDate
              ,CONVERT(XML, CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), CONTENT))) Def
            FROM Catalog C
               INNER JOIN Users U
               ON u.UserID = c.ModifiedByID
            WHERE Content IS NOT NULL AND Type != 3
               AND ItemID IN (
               SELECT c.ItemID
                  FROM Catalog C
                     LEFT OUTER JOIN ( SELECT v1.ItemID
                                            ,MAX(v1.modifiedDate) modifiedDate
                                          FROM VersionStore V1
                                          GROUP BY ItemID
                                     ) V
                     ON C.ItemID = v.ItemID
                  WHERE Content IS NOT NULL
                     AND ( v.itemID IS NULL
                           OR v.modifiedDate != c.ModifiedDate
                         ) )
END

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved