質問
SQL Server Reporting Services レポートを展開するための反復可能なプロセスを作成する必要があります。私は、これを行うために Visual Studio や Business Development Studio を使用することには賛成しません。デプロイメントをスクリプト化する rs.exe メソッドもかなり不格好に思えます。レポートを展開できる非常にエレガントな方法を持っている人はいますか。ここで重要なのは、プロセスを完全に自動化したいということです。
解決
私たちは rs.exe を使用します。一度スクリプトを開発したら、もう触る必要はなく、そのまま機能します。
これがソースです (テストする機会を与えずに機密データを削除するために手動で少し変更しました。何もブレーキをかけなかったことを願っています)。さまざまな言語のサブディレクトリからレポートと関連画像が展開されます。データソースも作成されます。
'=====================================================================
' File: PublishReports.rss
'
' Summary: Script that can be used with RS.exe to
' publish the reports.
'
' Rss file spans from beginnig of this comment to end of module
' (except of "End Module").
'=====================================================================
Dim langPaths As String() = {"en", "cs", "pl", "de"}
Dim filePath As String = Environment.CurrentDirectory
Public Sub Main()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
'Create parent folder
Try
rs.CreateFolder(parentFolder, "/", Nothing)
Console.WriteLine("Parent folder created: {0}", parentFolder)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
PublishLanguagesFromFolder(filePath)
End Sub
Public Sub PublishLanguagesFromFolder(ByVal folder As String)
Dim Lang As Integer
Dim langPath As String
For Lang = langPaths.GetLowerBound(0) To langPaths.GetUpperBound(0)
langPath = langPaths(Lang)
'Create the lang folder
Try
rs.CreateFolder(langPath, "/" + parentFolder, Nothing)
Console.WriteLine("Parent lang folder created: {0}", parentFolder + "/" + langPath)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
'Create the shared data source
CreateDataSource("/" + parentFolder + "/" + langPath)
'Publish reports and images
PublishFolderContents(folder + "\" + langPath, "/" + parentFolder + "/" + langPath)
Next 'Lang
End Sub
Public Sub CreateDataSource(ByVal targetFolder As String)
Dim name As String = "data source"
'Data source definition.
Dim definition As New DataSourceDefinition
definition.CredentialRetrieval = CredentialRetrievalEnum.Store
definition.ConnectString = "data source=" + dbServer + ";initial catalog=" + db
definition.Enabled = True
definition.EnabledSpecified = True
definition.Extension = "SQL"
definition.ImpersonateUser = False
definition.ImpersonateUserSpecified = True
'Use the default prompt string.
definition.Prompt = Nothing
definition.WindowsCredentials = False
'Login information
definition.UserName = "user"
definition.Password = "password"
Try
'name, folder, overwrite, definition, properties
rs.CreateDataSource(name, targetFolder, True, definition, Nothing)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Public Sub PublishFolderContents(ByVal sourceFolder As String, ByVal targetFolder As String)
Dim di As New DirectoryInfo(sourceFolder)
Dim fis As FileInfo() = di.GetFiles()
Dim fi As FileInfo
Dim fileName As String
For Each fi In fis
fileName = fi.Name
Select Case fileName.Substring(fileName.Length - 4).ToUpper
Case ".RDL"
PublishReport(sourceFolder, fileName, targetFolder)
Case ".JPG", ".JPEG"
PublishResource(sourceFolder, fileName, "image/jpeg", targetFolder)
Case ".GIF", ".PNG", ".BMP"
PublishResource(sourceFolder, fileName, "image/" + fileName.Substring(fileName.Length - 3).ToLower, targetFolder)
End Select
Next fi
End Sub
Public Sub PublishReport(ByVal sourceFolder As String, ByVal reportName As String, ByVal targetFolder As String)
Dim definition As [Byte]() = Nothing
Dim warnings As Warning() = Nothing
Try
Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + reportName)
definition = New [Byte](stream.Length) {}
stream.Read(definition, 0, CInt(stream.Length))
stream.Close()
Catch e As IOException
Console.WriteLine(e.Message)
End Try
Try
'name, folder, overwrite, definition, properties
warnings = rs.CreateReport(reportName.Substring(0, reportName.Length - 4), targetFolder, True, definition, Nothing)
If Not (warnings Is Nothing) Then
Dim warning As Warning
For Each warning In warnings
Console.WriteLine(warning.Message)
Next warning
Else
Console.WriteLine("Report: {0} published successfully with no warnings", targetFolder + "/" + reportName)
End If
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
Public Sub PublishResource(ByVal sourceFolder As String, ByVal resourceName As String, ByVal resourceMIME As String, ByVal targetFolder As String)
Dim definition As [Byte]() = Nothing
Dim warnings As Warning() = Nothing
Try
Dim stream As FileStream = File.OpenRead(sourceFolder + "\" + resourceName)
definition = New [Byte](stream.Length) {}
stream.Read(definition, 0, CInt(stream.Length))
stream.Close()
Catch e As IOException
Console.WriteLine(e.Message)
End Try
Try
'name, folder, overwrite, definition, MIME, properties
rs.CreateResource(resourceName, targetFolder, True, definition, resourceMIME, Nothing)
Console.WriteLine("Resource: {0} with MIME {1} created successfully", targetFolder + "/" + resourceName, resourceMIME)
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub
rs.exe を呼び出すバッチは次のとおりです。
SET ReportServer=%1
SET DBServer=%2
SET DBName=%3
SET ReportFolder=%4
rs -i PublishReports.rss -s %ReportServer% -v dbServer="%DBServer%" -v db="%DBName%" -v parentFolder="%ReportFolder%" >PublishReports.log 2>&1
pause
他のヒント
スクリプトを使用しました @デビッド 提供されていますが、コードを追加する必要がありました(コメントするには長すぎるため、これを回答として入力しています)。
問題は:レポート定義でレポートに「共有データソース」がすでにアタッチされている場合、これはスクリプトで作成されたデータソースと同じになることはありません。
これは、「CreateReport」メソッドによって発行される警告からも明らかです。
データ セット '' は、レポート サーバー上で公開されていない共有データ ソース '' を参照しています。
したがって、データ ソースは後で明示的に設定する必要があります。次のコード変更を加えました。
グローバル変数を追加しました。
Dim dataSourceRefs(0) As DataSource
CreateDataSource メソッドの最後に、その変数が設定されます。
Dim dsr As New DataSourceReference
dsr.Reference = "/" + parentFolder + "/" + db
Dim ds As New DataSource
ds.Item = CType(dsr, DataSourceDefinitionOrReference)
ds.Name = db
dataSourceRefs(0) = ds
そして、PublishReport メソッドでは、そのデータ ソースが (CreateReport が呼び出された後) 明示的に設定されます。
rs.SetItemDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)
この最後の呼び出しは RS 2005 以降のみであることに注意してください。レポートを RS 2000 サーバーにロードする場合は、Set を使用する必要があります。報告代わりにデータソース:
rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)
まあ、あまりエレガントではありません。私たちは、reportingservices2005 Web サービスを使用する独自のツールを作成しました。これが、欲しいものを手に入れる最も信頼できる方法であることがわかりました。
実際にはそれほど難しいことではなく、必要に応じてデータ ソースやフォルダーの作成など、他の作業を実行できるように拡張できます。
強くお勧めします RSScripter. 。概要に記載されているように:
Reporting Services Scripterは、すべてのMicrosoft SQL Serverレポートサービスカタログアイテムのスクリプトと転送を可能にする.NET Windowsフォームアプリケーションです。また、同じサーバー上のあるレポートサービスフォルダーから別のサービスフォルダーにマスのアイテムを簡単に移動するためにも使用できます。選択したスクリプトオプションに応じて、レポートサービスScripterは、説明、履歴オプション、実行オプション(レポート固有および共有スケジュールを含む)、サブスクリプション(通常およびデータ駆動型)、サーバーサイドレポートパラメーターなどのすべてのカタログアイテムプロパティを転送することもできます。
Business Development Studio を使用してこれを行うことに賛成ではないということは承知していますが、組み込みツールは非常に信頼性が高く、使いやすいことがわかりました。
CruiseControl.NET などの継続的インテグレーション ソリューションを検討しましたか?rs.exe を使用してレポートを展開できる場合は、CruiseControl で自動プロセスをセットアップして、タイマーまたはレポートが変更されるたびにレポートを構築および展開できます。
私たちの環境では、バージョン管理を使用して VS で開発し、DEV SSRS にデプロイします。レポートが検証されると、ReportSync プログラムを使用してレポートを展開します。 ReportServer DEV
に ReportServer PROD
. 。RS.EXE スクリプトも依然としてその役割を果たしていますが、レポートを促進するには ReportSync の方がはるかに簡単で機敏な方法であることがわかりました。
レポート同期:
ReportSync
は、無料でダウンロードして使用できるオープンソース プログラムです。レポートを一括ダウンロードするのに最適で、あるサーバーから別のサーバーにレポートをプッシュすることもできます。
プログラムをダウンロードするにはどうすればよいですか?
からソース コード ファイルをダウンロードします。 ギットハブ:Phires/ReportSynch, 、VS を実行し、ソリューション ファイル (.SLN) を開き、プログラムをコンパイルし、実行可能ファイル (.EXE) を見つけます。 C: emp eportsync-master\bin elease フォルダ。最後に、定期的に使用できるように .EXE をどこかに保存します。
レポートの所有者ではない場合、SSRS レポートを新しいサーバーにコピーするにはどうすればよいですか --> nunespascal による ReportSync の回答
レポートを展開するにはどうすればよいですか?
- 実行可能ファイルを実行すると、インターフェイスが起動します。
- 使用
SOURCE
そしてDESTINATION
を選択するダイアログsingle report
,multiple reports
, 、またはentire folder of reports
. 。任意のフォルダーをターゲットにすることができます。(ヒント:同じサーバー上にレポートを複製したい場合は、同じサーバーをターゲットにすることもできます。) - 選択を行った後、
Sync button
- ターゲット サーバーに移動し、変更日を確認して変更が有効になっていることを確認します。
このツールはとても便利ですが、いくつか問題があることに気付きました。例えば when I want to update just one report that already exists in the destination
, 、ここで私が選択しなければならないものがあります -- [Source:Report> Target:Folder> Sync
]。警告:ターゲット サーバー レポートを選択して更新すると思うかもしれませんが、これを試してみましたが、レポートは更新されません。
ReportSync では他に何ができるのでしょうか?
もあります。
Export
この機能は、すべての RDL ファイルをフォルダーにダンプしてアクセスできるようにするために非常にうまく機能します。これは、サーバーの移行、ファイルの VS ソリューション プロジェクトへの追加、またはすべてのファイルに対するその他の操作を行う必要がある場合に役立ちます。このプログラムのテストでは ではない 他のコンテンツ (サブスクリプション、共有データ ソース、共有データ セット) を移行します。これはレポート ファイルにのみ適用されます。
この投稿が古いことは承知していますが、RS.EXE スクリプトを調査しているときに見つけたので、この質問に答えようと思いました。