Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 SQL Reporting Service замена обращениий к серверам и БД  [new]
dermama
Member

Откуда:
Сообщений: 238
Добрый день!
Есть задача изменить названия серверов всех отчетов ms sql reporting service - отчетов много и скачивать каждый отчет отдельно, менять сервер и вновь загружать потребует больших затрат.
Есть БД ReportServer однако информация о подключениях в самих отчетах в ней я не нашел.
Подскажите, пожалуйста, есть ли какой то способ сделать это быстро - количество отчетов порядка 300?
Заранее спасибо
5 ноя 20, 18:04    [22227068]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
SERG1257
Member

Откуда:
Сообщений: 2788
dermama
информация о подключениях в самих отчетах в ней я не нашел.

https://docs.microsoft.com/en-us/sql/reporting-services/report-data/create-modify-and-delete-shared-data-sources-ssrs?view=sql-server-ver15
5 ноя 20, 18:16    [22227078]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
komrad
Member

Откуда:
Сообщений: 5345
dermama,

это зависит от того, используют ли отчеты свои собственные или shared источники данных.
shared datasources поменять легко


в случае собственных...
можно выгрузить сами отчеты в виде xml в файлы с помощью подобного запроса (см. столбец extract command)
select
	Name
    ,[Path]
     ,CONVERT(xml, CONVERT(varbinary(max), content)) AS Report
	 ,'bcp "select convert(xml,convert(varbinary(max),content)) from '
		+quotename(db_name())
		+'.dbo.Catalog where name=''' 
		+Name
		+'''" queryout '
		+replace(path,'/','_')
		+'-'
		+Name
		+'.rdl -S '
		+convert(varchar(200),@@servername)
		+' -T -c'  [extract command]
from ReportServer.dbo.[Catalog] 
where type=2 


поправить и залить обратно

а на счет "быстро" приходит на ум только такое - в файле hosts прописать соответствия старых и новых серверов
править на сервере, где установлен SSRS

Сообщение было отредактировано: 5 ноя 20, 18:43
5 ноя 20, 18:47    [22227097]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
dermama
Member

Откуда:
Сообщений: 238
komrad,
Доброе утро, спасибо - я правильно понимаю, что выгружать в rdl посредством cmd?
А уточните, пожалуйста, как я смогу залить измененные rdl обратно в БД reportserver?
6 ноя 20, 10:32    [22227378]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
dermama
Member

Откуда:
Сообщений: 238
dermama
komrad,
Доброе утро, спасибо - я правильно понимаю, что выгружать в rdl посредством cmd?
А уточните, пожалуйста, как я смогу залить измененные rdl обратно в БД reportserver?


И еще, уточните, пожалуйста, а в какую папку будет произведена выгрузка - так как в столбце extract command пути не указано - я ранее не работал с таким функционалом.
6 ноя 20, 11:00    [22227394]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
bamper78
Member

Откуда:
Сообщений: 115
dermama,
Перенесите бекап БД ReportServer на новый сервер и настройте подключение к ней.
6 ноя 20, 12:11    [22227432]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
komrad
Member

Откуда:
Сообщений: 5345
dermama
komrad,
Доброе утро, спасибо - я правильно понимаю, что выгружать в rdl посредством cmd?

да, BCP это утилита командной строки; обычно идет вместе с SQL Native Client

dermama

А уточните, пожалуйста, как я смогу залить измененные rdl обратно в БД reportserver?

Тут два варианта: вручную и автоматизированная массовая.

Автоматизированная массовая - это сложный процесс. Гуглить на тему "ssrs upload multiple rdl"

Однако, непонятны следующие моменты:
- структура папок в SSRS (отчеты надо разложить в существующие папки)
- какие типы data sources используются (надо ли выгружать все отчеты или достаточно поправить shared data sources?)
- имеются ли подписки на отчеты (слетят ли они при перезаписи отчета?)
6 ноя 20, 12:12    [22227433]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
komrad
Member

Откуда:
Сообщений: 5345
dermama

И еще, уточните, пожалуйста, а в какую папку будет произведена выгрузка - так как в столбце extract command пути не указано - я ранее не работал с таким функционалом.

В ту папку, из которой будет вызываться BCP (текущую).

Обратите внимание - отчеты будут выгружены с названиями папок. Таким образом обходится ситуация с одноименными отчетами в разных папках.
Если создадите на диске копию структуры папок SSRS, то для выгрузки отчетов по папкам запрос можно модицифировать следующим образом:

select 
      Name
     ,[Path]
     --,CONVERT(xml, CONVERT(varbinary(max), content)) AS Report
     ,'bcp "select convert(xml,convert(varbinary(max),content)) from '
		+quotename(db_name())
		+'.dbo.Catalog where name=''' 
		+Name
		+'''" queryout "'
		+'.'
		+replace(path,'/','\')
		+'.rdl" -S '
		+convert(varchar(200),@@servername)
		+' -T -c'  [extract command]
from dbo.[Catalog] 
where type=2 


Важно:
- запрос запускать в базе ReportServer;
- эккаунт, под котором запускается BCP и сама командная строка, должен иметь полный доступ к базе ReportServer;
- BCP использует аутентификацию Windows.

Если аутентификация SQL, то ключ "-T " надо заменить на "-U login -P password " со своими login и password.

Сообщение было отредактировано: 6 ноя 20, 12:29
6 ноя 20, 12:33    [22227450]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
komrad
Member

Откуда:
Сообщений: 5345
кстати, полагаю, что этот топик для раздела "Отчетные системы"
6 ноя 20, 13:09    [22227476]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
komrad
Member

Откуда:
Сообщений: 5345
dermama,

а, кстати, что вернет этот запрос?

select Name,count(1) [n]
from dbo.[Catalog] 
group by Name  
having count(1)>1  
6 ноя 20, 13:36    [22227495]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
dermama
Member

Откуда:
Сообщений: 238
komrad
dermama,

а, кстати, что вернет этот запрос?

select Name,count(1) [n]
from dbo.[Catalog] 
group by Name  
having count(1)>1  


Данный запрос вернул мне 94 строки,
с одинаковыми названиями отчетов, но в разных папках разных подкаталогов.
количество повторяющихся названий от 2 до 9

если просто подсчитать количество отчетов по названиям, то получается 953

Сообщение было отредактировано: 6 ноя 20, 14:30
6 ноя 20, 14:33    [22227537]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
komrad
Member

Откуда:
Сообщений: 5345
dermama

Данный запрос вернул мне 94 строки,
с одинаковыми названиями отчетов, но в разных папках разных подкаталогов.
количество повторяющихся названий от 2 до 9

если просто подсчитать количество отчетов по названиям, то получается 953


тогда выгружать надо по ID и раскладывать по папкам локально

исправленный скрипт
select 
      Name
     ,[Path]
     --,CONVERT(xml, CONVERT(varbinary(max), content)) AS Report
     ,'bcp "select convert(xml,convert(varbinary(max),content)) from '
		+quotename(db_name())
		+'.dbo.Catalog where ItemID=''' 
		+convert(varchar(200),ItemID)
		+'''" queryout "'
		+'.'
		+replace(path,'/','\')
		+'.rdl" -S '
		+convert(varchar(200),@@servername)
		+' -T -c'  [extract command]
from dbo.[Catalog] 
where type=2 
6 ноя 20, 14:46    [22227547]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
komrad
Member

Откуда:
Сообщений: 5345
komrad
тогда выгружать надо по ID и раскладывать по папкам локально


скрипт на создание дерева папок SSRS в текущей папке

select distinct 'mkdir ".'+replace(replace(path,name,''),'/','\')+'"' [create folders]
from catalog
where type=2 
6 ноя 20, 14:54    [22227553]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
Нелегкая же дорога у тех, кто не желает пользоваться инструментами MS... Установите VS, добавьте инструментарий разработки баз данных, импортируйте отчеты в решение. Дальше - дело техники, поиск, замена, развертывание проекта.
6 ноя 20, 15:52    [22227579]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
vikkiv
Member

Откуда: London
Сообщений: 2757
Visual Studio - инструмент явно не для администрации (/конфиг.) и не для мониторинга SSRS/PBIRS,
а для разработки (как правильно замечено выше) / контроля версий (тестирование и в некотором смысле - выгрузка, но не прод.)
(хотя держать в проекте VS как советуют в пред. посте - вообще-то стандарт, можно ещё готовить к релизам но не сами релизы на выпуск)

для этих целей у MS документирован REST API в основном, (SOAP {..asmx?wsdl..} уже списали несколько лет назад, но пока работает),
ну ещё частично конфигуратор, SSMS и несколько других примочек (не важно как ими работать, частая практика - через PowerShell)
Процедуры SSRS базы данных предназначены для внутренних целей сервиса, ну разве что таблицы можно для мониторинга использовать.
(прямая выгрузка от туда и загрузка напрямую в SQL - явный кактус)

Для пакетной обработки именно REST, в первую очередь, документировано (хоть и частичично кривовато)

Если не по фэн-шую (потому-что не предназначено) переписывать напрямую в базу
(против течения, там хоть и триггеров нет но наверное и хэши завязаны)
- то как кто-то выше намекал: запросто можно побить и ID-шники со слётом связей
к другим обьектам (и в др. системах, простейший пример: агент и подписки)
потерять настройки доступа/безопасности на отчётах,
и естественно искорёжить xранилище учётных данных / сбить ключи (крипта/шифрование)
на те-же источники данных при некоторых типах аутентификации - сервера которых меняет TS

REST API (метод GET) прекрасно даёт и список объектов (JSON) со свойствами (путь, размер, ID-шники и мн. пр.)
и сам объект (скачать) по пути либо ID, и предоставляет возможность положить объекты обратно на сервер
например: http://my-server/Reports/api/v2.0/CatalogItems
задачи такого класса (пакетного/массового обслуживания)
явно не для SQL (напрямую) и не для Visual Studio (хотя некоторые инструменты для этого там есть или хранятся/разрабатываются)
8 ноя 20, 12:51    [22228297]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
dermama
Member

Откуда:
Сообщений: 238
vikkiv


REST API (метод GET) прекрасно даёт и список объектов (JSON) со свойствами (путь, размер, ID-шники и мн. пр.)
и сам объект (скачать) по пути либо ID, и предоставляет возможность положить объекты обратно на сервер
например: http://my-server/Reports/api/v2.0/CatalogItems
задачи такого класса (пакетного/массового обслуживания)
явно не для SQL (напрямую) и не для Visual Studio (хотя некоторые инструменты для этого там есть или хранятся/разрабатываются)


Добрый день!
Спасибо за подробный ответ.
я нашел инфу на сайте swaggerhub с доступными командами по GET, POST и так далее - получилось выгрузить файл JSON по всем очтетам, попробовал также команды по datasource - выгружается инфа по всем Общим источникам данных - однако не получается выгрузить инфу по всем отчетам, с подробным описанием собственных коннектов отчета - такое возможно только если указывать ID какого либо отчета.

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

Т.Е. по сути мне удалось выгрузить некую информацию по ссылке http://my-server/Reports/api/v2.0/CatalogItems
однако подробной информации о коннектах здесь нет.
Пробовал также http://my-server/Reports/api/v2.0/datasource - также общая инфа по общим коннектам.
10 ноя 20, 11:42    [22229406]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
dermama
Member

Откуда:
Сообщений: 238
dermama
vikkiv


REST API (метод GET) прекрасно даёт и список объектов (JSON) со свойствами (путь, размер, ID-шники и мн. пр.)
и сам объект (скачать) по пути либо ID, и предоставляет возможность положить объекты обратно на сервер
например: http://my-server/Reports/api/v2.0/CatalogItems
задачи такого класса (пакетного/массового обслуживания)
явно не для SQL (напрямую) и не для Visual Studio (хотя некоторые инструменты для этого там есть или хранятся/разрабатываются)


Добрый день!
Спасибо за подробный ответ.
я нашел инфу на сайте swaggerhub с доступными командами по GET, POST и так далее - получилось выгрузить файл JSON по всем очтетам, попробовал также команды по datasource - выгружается инфа по всем Общим источникам данных - однако не получается выгрузить инфу по всем отчетам, с подробным описанием собственных коннектов отчета - такое возможно только если указывать ID какого либо отчета.

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

Т.Е. по сути мне удалось выгрузить некую информацию по ссылке http://my-server/Reports/api/v2.0/CatalogItems
однако подробной информации о коннектах здесь нет.
Пробовал также http://my-server/Reports/api/v2.0/datasource - также общая инфа по общим коннектам.


и соответственно как обратно постить измененную инфу (в случае если бы удалось добраться до подробного описания собственных коннектов отчета) не понятно на данный момент.
10 ноя 20, 11:48    [22229414]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
dermama,

300 отчетов, кстати, не так много, если не хотите пользоваться студией, то можно выполнить dowload каждого отчета, отредактировать и выполнить upload. За пару дней спокойно управитесь.
10 ноя 20, 16:05    [22229649]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
SERG1257
Member

Откуда:
Сообщений: 2788
Владислав Колосов
dowload каждого отчета, отредактировать и выполнить upload
+1
Гораздо дольше будет протестировать каждый отчет.

Заодно можно будет проделать рефакторинг: просмотреть на все отчеты, отделить нужные отчеты от остальных, сформировать источники данных

dermama
количество повторяющихся названий от 2 до 9
Нюхом чую бардак
10 ноя 20, 16:31    [22229661]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
SERG1257,

бардак однозначно, т.к. даже проекта нет.
10 ноя 20, 17:24    [22229697]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34241
Блог
dermama,

если лог настроен, то можете отбросить неактуальное старье
10 ноя 20, 17:37    [22229707]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
vikkiv
Member

Откуда: London
Сообщений: 2757
Владислав Колосов
то можно выполнить dowload каждого отчета, отредактировать и выполнить upload. За пару дней спокойно управитесь.
Яркий пример как одним махом можно отбросить развитие IT индустрии на пол века назад списав на нет всё программирование
завтра посыпятся предложения по ведению баз данных на бумаге карандашом, а огонь разжигать огнивом




SERG1257
просмотреть на все отчеты, отделить нужные отчеты от остальных,
Это задача BA а не разработчика (или IT админа)
в нормалньой организации навряд-ли есть позиции где IT-шникам нечем заняться до такой степени что приходится самим себе изобретать занятие..
обычно с натяжкой хватает времени разгребсти существующую нагрузку (и какие задачи отбросить из-за недостатка ресурса)
12 ноя 20, 12:15    [22230666]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
vikkiv
Member

Откуда: London
Сообщений: 2757
dermama,

На swaggerhub более глубокое древо API команд чем CatalogItems и DataSources,
последняя применима для Shared DataSources а не для каждого отчёта
для данной конкретной задачи (именно .rdl отчёты) рекомендую посмотреть ветку /Reports с более селективными: /Report() и /Report(id)/DataSources

По инструменту проходящему принципы безопасников - из компилированных можно и C#/VB.NET (классом WebRequest или более новым WebClient )
разными вариантами (CLR напр.), кстати - эти языки встроены в SSIS, даже t-SQL
(но если сервер может стучаться наружу то как-бы не по фэншую, даже включение этой функциональности если сеть закрытая - т.е. для внутренних сервисов)

если вопрос прозрачности: из наглядных скриптовых методов - тот-же PowerShell
сейчас по быстрому накидаю чего-нибудь из примеров, может в архивах сырое что осталось..
12 ноя 20, 12:31    [22230675]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
vikkiv
Member

Откуда: London
Сообщений: 2757
Всё есть в API документации (но там многое криво если честно - всё в стадии разработке и дополнений по возможности),
покопался в сыром архиве по SSRS, на PowerShell
вот так можно просмотреть все существующие ConnectionString (напр. в Shared DS его нет) из DataSources (которых на отчёт может быть несколько) где есть *local*
#=============
$ssrs_web="http://localhost/PBI"
[String]$srch="local"

[String]$ssrs_api=$ssrs_web+"/api/v2.0/Reports"
$tbl=New-Object System.Data.DataTable;$tbl.Columns.AddRange(@("Report","DataSource","ConnectionString","ReportId"))>$null
foreach($r in(Invoke-RestMethod -Uri $ssrs_api -UseDefaultCredentials).value|?{$_.HasDataSources -eq $true})
{foreach($ds in(Invoke-RestMethod -Uri ($ssrs_api+"("+$r.Id+")/DataSources") -UseDefaultCredentials))
{foreach($sr in $ds.value|?{$_.ConnectionString -ne $null -and $_.ConnectionString -like ("*"+$srch+"*")})
{$tbl.Rows.Add($r.Path,$sr.Name,$sr.ConnectionString,$r.Id)>$null}}}
$tbl|ft
#=============
вот так скачать все .rdl (xml) отчёты (для других объектов - другая API ветка) в одну папку (по ID) для послед. обработки как xml ноды или под более примитивную текстовую замену
#=============
$ssrs_web="http://localhost/PBI"
$download_dir="c:\tst\ssrs_id\in"

$ssrs_api=$ssrs_web+"/api/v2.0/Reports"
if((Test-Path $download_dir) -eq $false){New-Item -ItemType Directory -Force -Path $download_dir | Out-Null}
foreach($r in(Invoke-RestMethod -Uri $ssrs_api -UseDefaultCredentials).value|?{$_.Type -eq "Report"})
{Invoke-RestMethod -Uri ($ssrs_api+"("+$r.ID+")/Content/"+'$value') -UseDefaultCredentials -OutFile ($download_dir+"\"+$r.id)}
#=============

а вот так по полному пути (но я предпочитаю по ID т.к. как-то была проблема из-за слишком длинных путей при записи на сетевое хранилище, хотя и менее читабельно)
хотя такое уже приведено выше более простым (и не совсем рекомендованным) методом через t-SQL (не факт что на сервере разрешена такая функциональность в конфигурации SQL Server-а)
#=============
$ssrs_web="http://localhost/PBI"
$download_dir="c:\tst\ssrs_id\dr"

$ssrs_api=$ssrs_web+"/api/v2.0/Reports"
foreach($r in(Invoke-RestMethod -Uri $ssrs_api -UseDefaultCredentials).value)
{$dr=$download_dir+$r.Path.Substring(0,$r.Path.LastIndexOf("/")).Replace("/","\")
if((Test-Path $dr) -eq $false){New-Item -ItemType Directory -Force -Path $dr | Out-Null}
Invoke-RestMethod -Uri ($ssrs_api+"("+$r.ID+")/Content/"+'$value') -UseDefaultCredentials -OutFile ($download_dir+$r.Path.Replace("/","\")+".rdl")}
#=============


вот так .rdl отчёт записывается на сервер (можно и развить пройдясь циклом для каждого обработанного отчёта в Out директории)
#=============
$ssrs_web="http://localhost/PBI"
$rdl_name="my_report_test1"

$ssrs_api=$ssrs_web+"/api/v2.0/Reports"
$my_rdl = "C:\tst\ssrs_id\in\8d6dc5eb-8f7a-496a-bebb-798e356dc2b1"
$web_rdl=@{
    "@odata.type"="#Model.Report";
    "Content"=[System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes($my_rdl));
    "ContentType"="";
    "Name" = $rdl_name;
    "Path" = '/';
    }|ConvertTo-Json
Invoke-RestMethod -Uri $ssrs_api -Method Post -Body $web_rdl  -ContentType "application/json" -UseDefaultCredentials
#=============

судя по документации REST методом можно записать и саму коллекцию DataSources (JSON) для конкретного отчёта напрямую на сервер без отдельного сохранения в дисковых папках
(но это сам не делал, у нас немного другие задчи массового обслуживания SSRS инфраструктуры были)
или в самих rdl через xml навигацию XPath методом SelectSingleNode с InnerXML или InnerText поменять значение ConnectionString ноды
т.е. вместо REST метода PATCH на /CatalogItems(Id) - только PUT метод через /Reports(Id)/DataSources

так-же зависит от SSRS версии - у меня это работает на последнем релизе Power BI Report Server

Сообщение было отредактировано: 12 ноя 20, 13:20
12 ноя 20, 13:16    [22230708]     Ответить | Цитировать Сообщить модератору
 Re: SQL Reporting Service замена обращениий к серверам и БД  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
vikkiv,

готов поспорить, что Вы получили свои знания, которые продемонстрировали, не за пару дней, о которых я писал. А мой метод не требует никаких специальных знаний. Т.е. он эффективнее, учитывая однократность операции.
12 ноя 20, 19:01    [22231052]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить