Развертывание служб Reporting Services

Мне нужно создать повторяемый процесс для развертывания отчетов служб отчетов SQL Server. Я не сторонник использования Visual Studio или Business Development Studio для этого. Метод сценариев развертывания rs.exe также кажется довольно неуклюжим. Есть ли у кого-нибудь очень элегантный способ развертывания отчетов. Ключевым моментом здесь является то, что я хочу, чтобы процесс был полностью автоматизирован.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
33
0
17 112
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я знаю, вы говорите, что не поддерживаете Business Development Studio, но я считаю, что встроенные инструменты очень надежны и просты в использовании.

О, я согласен. Проблема в том, что я действительно хочу, чтобы развертывание было полностью автоматизировано.

Bart 18.09.2008 03:40

ах. мы выполняем развертывание только на тестовом и производственном сервере, и только после внесения изменений, поэтому использование встроенных инструментов работает для нас очень хорошо (нам повезло, я думаю)

cori 18.09.2008 18:49

Ну, не очень элегантно. Мы создали свой собственный инструмент, который использует веб-сервис ReportingServices2005. Мы обнаружили, что это самый надежный способ получить то, что мы хотим.

На самом деле это не так уж сложно и позволяет вам расширять его для других вещей, таких как создание источников данных и папок по мере необходимости.

Вы изучали какие-либо решения для непрерывной интеграции, такие как CruiseControl.NET? Если вы можете развернуть отчеты с помощью rs.exe, вы можете настроить автоматический процесс в CruiseControl для создания и развертывания отчетов по таймеру или при изменении отчета.

Ответ принят как подходящий

Мы используем 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

Здравствуй. Я пытался использовать этот сценарий для развертывания собственных служб отчетов. Вопрос .. Как организовать структуру каталогов на моем компьютере? Есть ли у меня проект vs для каждого подкаталога отчетов, который мне нужен?

BigJoe714 16.02.2009 17:09

Это не имеет ничего общего с проектами VS. Сценарий ожидает подпапку для каждой языковой мутации (например, en, de, см. Начало сценария). Каждая языковая папка содержит файлы rdl и используемые ресурсы (обычно изображения, используемые в отчетах).

Lukáš Rampa 10.03.2009 16:49

Я понимаю, что этот сценарий не имеет ничего общего с проектами VS, но я разрабатываю свои отчеты в Visual Studio, поэтому мне было интересно, как организовать структуру каталогов проекта, чтобы я мог использовать этот сценарий для развертывания отчетов вместо Метод VS.

BigJoe714 02.04.2009 21:44

Спасибо за сценарий! Но вам нужно снова явно указать источник данных: см. мой ответ.

fretje 03.05.2010 19:41

Я настоятельно рекомендую RSScripter. Как отмечено в обзоре:

Reporting Services Scripter is a .NET Windows Forms application that enables scripting and transfer of all Microsoft SQL Server Reporting Services catalog items to aid in transferring them from one server to another. It can also be used to easily move items on mass from one Reporting Services folder to another on the same server. Depending on the scripting options chosen, Reporting Services Scripter can also transfer all catalog item properties such as Descriptions, History options, Execution options (including report specific and shared schedules), Subscriptions (normal and data driven) and server side report parameters.

к сожалению, RSScripter больше не обновляется, что означает, что он не поддерживает новые объекты, такие как общие наборы данных ...

Valentino Vranken 14.09.2012 12:45

Я использовал предоставленный сценарий @Дэйвид, но мне пришлось добавить код (я набираю его как ответ, так как это будет слишком долго для комментария.

Проблема заключается в следующем: если в определении отчета уже есть «общий источник данных», прикрепленный к отчету, это никогда не будет тем же источником данных, что и тот, который создается в сценарии.

Это также становится очевидным из предупреждения, выдаваемого методом CreateReport:

The data set '' refers to the shared data source '', which is not published on the report server.

Таким образом, после этого необходимо явно указать источник данных. Я внес следующие изменения в код:

Я добавил глобальную переменную:

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ОтчетDataSources вместо:

rs.SetReportDataSources(targetFolder + "/" + reportName.Substring(0, reportName.Length - 4), dataSourceRefs)

Я надеялся, что есть способ исправить эту ссылку перед вызовом CreateReport, потому что я хочу, чтобы вывод моего скрипта был без предупреждений, но, по крайней мере, теперь он работает.

Peet Brits 07.03.2012 15:03

В нашей среде мы разрабатываем в VS с контролем версий, а затем развертываем в DEV SSRS. После проверки отчета мы используем программу ReportSync для развертывания отчетов с ReportServer DEV на ReportServer PROD. Сценарии RS.EXE по-прежнему актуальны, но я обнаружил, что ReportSync является гораздо более простым и гибким способом продвижения отчета.

ReportSync:

ReportSync - это программа с открытым исходным кодом, которую можно бесплатно загрузить и использовать. Он отлично подходит для массовой загрузки отчетов и даже может передавать отчет с одного сервера на другой.


Как скачать программу?

Как развернуть отчет?

  1. Запустите исполняемый файл, и интерфейс запустится.
  2. Используйте диалоговые окна SOURCE и DESTINATION, чтобы выбрать single report, multiple reports или entire folder of reports. Вы можете любую целевую папку, которую хотите. (ПОДСКАЗКА: вы даже можете настроить таргетинг на один и тот же сервер, если хотите дублировать отчет на том же сервере.)
  3. Сделав свой выбор, нажмите Sync button.
  4. Перейдите на целевой сервер и убедитесь, что изменение вступило в силу, просмотрев Дата изменения.

Этот инструмент был очень удобен, но я заметил некоторые особенности. Например, 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, поэтому подумал, что дам ответ на этот вопрос.

Другие вопросы по теме