Ménage sur un ancien SSRS, ce serveur particulier est le 2008R2.
J'ai la requête ci-dessous qui me donne le nom, l'emplacement, la création et la vue d'ensemble des modifications pour tous les rapports. Je voudrais également inclure au moins la "chaîne de connexion" et, si possible, d'autres détails dans les propriétés des sources de données. Mais je ne le trouve pas dans ReportServer. J'ai vu des gens utiliser PowerShell pour le retirer du service Web SSRS, j'espérais trouver une solution T-SQL.
Comment afficher les détails de la source de données avec une requête SQL?
--List all the reports on SSRS via "ReportServer" database
USE [ReportServer]
GO
SELECT Name
--, [ItemID] --Primary key
, [Path]
, [Description]
--, [CreatedByID] --need link to get anything usable from here
, Created.UserName as CreatedByUser
, [CreationDate]
--, [ModifiedByID] --need link to get anything usable from here
, Modified.UserName as ModifiedByUser
, [ModifiedDate]
FROM [dbo].[Catalog]
left join (select [UserID]
, [UserName]
from [dbo].[Users]) as Created
on Catalog.CreatedByID = Created.UserID
left join (select [UserID]
, [UserName]
from [dbo].[Users]) as Modified
on Catalog.ModifiedByID = Modified.UserID
WHERE [Type] = 2 -- value per foundation Source http://sqlsrv4living.blogspot.com/2014/01/ssrs-get-list-of-all-reports-using.html
ORDER BY [Path], Name
Obtenir des sources de données SSRS à partir de ReportServer
Je voudrais également inclure au moins la "chaîne de connexion"
Comment afficher les détails de la source de données avec une requête SQL?
TSQL pour obtenir la chaîne de connexion des sources de données SSRS
-- Transact-SQL script to get connection string of all SSRS Shared Datasources.
/*
Let's say you want to move a database to an other SQL Server, but which of the SSRS Shared Datasources uses this database and must be changed afterwards?
With this Transact-SQL query for ReportServer database you get the connection string of all Shared Datasources,
to document the usage or to search for a specific server/database.
Please remark: Querying the ReportServer database directly is not a supported way.
Works with SSRS 2005 and higher version ReportServer databases.
Requieres select rights on the "Catalog" table in ReportServer database.
*/
-- Connection strings of all SSRS Shared Datasources
;WITH XMLNAMESPACES -- XML namespace def must be the first in with clause.
(DEFAULT 'http://schemas.Microsoft.com/sqlserver/reporting/2006/03/reportdatasource'
,'http://schemas.Microsoft.com/SQLServer/reporting/reportdesigner'
AS rd)
,SDS AS
(SELECT SDS.name AS SharedDsName
,SDS.[Path]
,CONVERT(xml, CONVERT(varbinary(max), content)) AS DEF
FROM dbo.[Catalog] AS SDS
WHERE SDS.Type = 5) -- 5 = Shared Datasource
SELECT CON.[Path]
,CON.SharedDsName
,CON.ConnString
FROM
(SELECT SDS.[Path]
,SDS.SharedDsName
,DSN.value('ConnectString[1]', 'varchar(150)') AS ConnString
FROM SDS
CROSS APPLY
SDS.DEF.nodes('/DataSourceDefinition') AS R(DSN)
) AS CON
-- Optional filter:
-- WHERE CON.ConnString LIKE '%Initial Catalog%=%TFS%'
ORDER BY CON.[Path]
,CON.SharedDsName;
Voici une requête pour ajouter également le nom de la source de données à l'aide de votre TSQL:
USE [ReportServer]
GO
SELECT CATALOG.NAME
,CATALOG.[Path]
,DataSource.NAME datasource
,CATALOG.[Description]
,Created.UserName AS CreatedByUser
,CATALOG.[CreationDate]
,Modified.UserName AS ModifiedByUser
,CATALOG.[ModifiedDate]
FROM [dbo].[Catalog]
LEFT JOIN (
SELECT [UserID]
,[UserName]
FROM [dbo].[Users]
) AS Created ON CATALOG.CreatedByID = Created.UserID
LEFT JOIN (
SELECT [UserID]
,[UserName]
FROM [dbo].[Users]
) AS Modified ON CATALOG.ModifiedByID = Modified.UserID
JOIN DataSource ON CATALOG.ItemID = DataSource.ItemID
JOIN CATALOG cat1 ON DataSource.Link = cat1.ItemID
WHERE CATALOG.[Type] = 2
ORDER BY [Path]
,NAME
Tu ne peux pas.
Lorsque vous téléchargez la source de données et les définitions de rapport sur le serveur de rapports, il stocke leurs informations dans la table dbo.Catalog que vous pouvez voir à l'aide de Convert (Xml, Convert (Varbinary (Max), Content)) et comme c'est XML, vous pouvez utiliser XPath pour extraire les champs qui vous intéressent.
Les problèmes commencent vraiment une fois que vous avez modifié quoi que ce soit sur l'interface graphique Web SSRS.
Si vous modifiez la chaîne de connexion dans une source de données partagée ou modifiez la source de données d'un rapport, SSRS laissera l'entrée de catalogue telle quelle et ajoutera à la place une entrée à la table dbo.DataSource avec une ConnectionString chiffrée pour contenir le contenu mis à jour.
Bien que vous ne puissiez pas le décrypter ici, vous pourrez peut-être extraire certaines des chaînes de connexion, puis signaler celles qui sont obsolètes; mais je n'ai pas pu trouver comment il stocke les liens entre l'ancien/nouveau contenu.
Cela a également été discuté auparavant sur Ask SSC où ils sont arrivés à la même conclusion https://ask.sqlservercentral.com/questions/20328/decrypting-datasources-in-ssrs.html
Et il y a une collection de scripts partiels pour appeler l'API Web et WMI sur SSC lui-même lorsqu'ils ont discuté de la même chose http://www.sqlservercentral.com/Forums/Topic1312030-150-1.aspx
Je vous encourage à retourner le problème et à essayer de trouver une solution PowerShell car avec la complexité croissante de SQL Server, il n'est tout simplement plus possible d'essayer de tout faire dans T-SQL.
Utiliser le module ReportingServicesTools pour Powershell pour obtenir les détails de la source de données est probablement le meilleur (get-RsDatasource), car il est capable d'extraire et de décrypter la ConnectString pour une source de données (sans mot de passe ou nom d'utilisateur), et donne également le nom d'utilisateur qu'il pourrait utiliser dans un domaine distinct. Il le fait via le fournisseur SOAP.
Une source de données stockée dans la table Catalog (type = 5) a également généralement sa ConnectionString stockée dans le champ [Content], que vous pouvez ensuite essayer d'extraire avec une requête XPath. Mais sur mon serveur, j'ai quelques-unes de ces sources de données qui ont leurs informations de connexion stockées quelque part ailleurs, donc la requête basée sur SQL ne renvoie aucune information de chaîne de connexion pour eux. La fonction get-RsDatasource de ReportingServicesTools renverra cependant la chaîne de connexion pour ceux-ci.
J'ai également un tas de rapports fournis par le système tiers qui ont leur propre fournisseur personnalisé. Ceux-ci ne stockent pas de chaîne de connexion dans leur RDL ou dans les tables ReportingServices..Catalog ou ReportingServices..Datasource. get-RsDatasource renvoie un bupkus pour les connexions de ces rapports.
J'imagine que si j'étais un peu plus motivé, j'ajouterais d'autres éléments à ma requête t-sql pour essayer de supprimer les informations de connexion du RDL également. Mais à l'exception des rapports d'application, nos rapports développés en interne utilisent tous des sources de données partagées, donc ma motivation est faible.
ymmv.