Изменение источника данных SSRS отчета программно на стороне сервера

Сегодня для каждого клиента мы развертываем одну и ту же папку отчетов SSRS и папку источника данных. Разница между этими папками - это имя каждой папки и строка подключения источника данных.

Мы используем Report Server 2008 R2.

Возможно ли поддерживать только одну папку отчетов и источников данных и программно изменять ее строку соединения на стороне сервера до того, как отчет будет отображаться?

Если нет, это что-то, что может быть достигнуто путем изменения некоторой логики в отчетах? Сегодня мы используем опцию "shared data source".

Ответ 1

Это то, что мы сделали в нашей среде - мы поддерживаем один набор отчетов, которые могут быть развернуты на любом клиенте с их собственной конфигурацией.

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

1. Используйте утилиту rs.exe и файл script

rs.exe в онлайн-книгах

Эта программа позволяет создавать файлы script (в VB.NET), которые могут взаимодействовать с веб-службой сервера отчетов. Вы создаете файл script (например, Deploy.rss) и вызываете программу rs.exe с различными параметрами, включая любые пользовательские, которые вы определяете:

rs.exe -i DeployReports.rss -s http://server/ReportServer -v DatabaseInstance="SQL" -v DatabaseName="ReportDB" -v ReportFolder="ClientReports"

Таким образом, это вызовет script DeployReports.rss, подключится к http://server/ReportServer с тремя пользовательскими параметрами, которые могут быть использованы для создания источника данных и папки отчета.

В файле scipt у вас может быть что-то вроде этого:

Public Sub Main()

    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    CreateFolder(reportFolder, "Report folder")
    CreateFolder(datasourceFolder, "Data source folder")
    CreateDataSource()

End Sub

Что может затем совершать вызовы веб-службы, например:

rs.CreateFolder(folderName, "/", Nothing)

'Define the data source definition.
Dim definition As New DataSourceDefinition()
definition.CredentialRetrieval = CredentialRetrievalEnum.Integrated
definition.ConnectString = "data source=" + DatabaseInstance + ";initial catalog=" + DatabaseName
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

Try

    rs.CreateDataSource(datasource, datasourcePath, False, definition, Nothing)
    Console.WriteLine("Data source {0} created successfully", datasource)

Catch e As Exception

    Console.WriteLine(e.Message)

End Try

Вы не указали, какую версию служб Reporting Services используете, поэтому я предполагаю, что 2008 год. Обратите внимание, что в зависимости от версии SQL Server можно использовать несколько конечных точек. Конечная точка 2005/2008 года устарела в 2008 R2 и выше, но все еще пригодна для использования. Просто что-то иметь в виду при написании script.

2. Вызовите веб-службу SSRS с помощью приложения

Обзор веб-службы сервера отчетов

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

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

Использование script проще запускать, поскольку он просто запускает программу из командной строки, но создание собственного приложения развертывания, безусловно, даст большую гибкость. Я бы порекомендовал вам запустить script, чтобы вы поняли процесс, а затем перенесите его на заказное приложение, если это необходимо. Удачи!

Ответ 2

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

Примечание: будьте осторожны с последствиями безопасности. Поймите, что если вы передадите конфиденциальные данные (например, пароли) в параметр, то (а) он перейдет через провод, и (b) будет сохранен в таблицах журнала выполнения для служб отчетов.