20

Soy nuevo en SQL Server, y lamento que haya una solución obvia para mi pregunta, pero parece que no puedo encontrar eso.Enumerar todas las fuentes de datos y sus dependencias (informes, elementos, etc.) en SQL Server 2008 R2

Estoy buscando generar un informe (o lista) de todas las fuentes de datos y sus dependencias individuales en un SQL Server 2008 R2 (servidor de informes).

Sé que puedo acceder a cada fuente de datos para obtener una lista de todos los elementos que dependen de ella. He hecho esto en el pasado pero lleva mucho tiempo.

¿Hay alguna forma de obtener un informe que muestre todas las fuentes de datos y sus elementos dependientes?

Gracias de antemano,

Marwan

+0

Lo clasificaría como un elemento dependiente? Solo modelos, conjuntos de datos e informes, ¿o hay otros? – Bryan

+2

@beargle - Definiría un elemento dependiente como cualquier informe que use la fuente de datos. Actualmente, cada fuente de datos tiene un "Ver elementos dependientes" en su menú. Entonces, cualquier cosa que se enumere en eso calificaría como un elemento dependiente. Espero que eso ayude a aclarar mi pregunta/solicitud. Gracias. –

Respuesta

22

La siguiente (que fue modificado a partir de lo que beargle publicado anteriormente) hace lo que yo estaba buscando. Esto mostrará una lista de todas las fuentes de datos por su nombre real, y todos sus elementos dependientes:

SELECT 
    C2.Name AS Data_Source_Name, 
    C.Name AS Dependent_Item_Name, 
    C.Path AS Dependent_Item_Path 
FROM 
    ReportServer.dbo.DataSource AS DS 
     INNER JOIN 
    ReportServer.dbo.Catalog AS C 
     ON 
      DS.ItemID = C.ItemID 
       AND 
      DS.Link IN (SELECT ItemID FROM ReportServer.dbo.Catalog 
         WHERE Type = 5) --Type 5 identifies data sources 
     FULL OUTER JOIN 
    ReportServer.dbo.Catalog C2 
     ON 
      DS.Link = C2.ItemID 
WHERE 
    C2.Type = 5 
ORDER BY 
    C2.Name ASC, 
    C.Name ASC; 
+0

@beargle - Gracias por ayudarme a resolver esto (^_^) –

+0

Funcionó en el primer intento. Excelente respuesta Todo lo que tuve que hacer es cambiar el nombre de la base de datos. –

+0

Gracias por la consulta ... –

8

Esta consulta se deben ejecutar contra la base de datos ReportServer

SELECT 
    DS.Name AS DatasourceName, 
    C.Name AS DependentItemName, 
    C.Path AS DependentItemPath 
FROM 
    ReportServer.dbo.Catalog AS C 
     INNER JOIN 
    ReportServer.dbo.Users AS CU 
     ON C.CreatedByID = CU.UserID 
     INNER JOIN 
    ReportServer.dbo.Users AS MU 
     ON C.ModifiedByID = MU.UserID 
     LEFT OUTER JOIN 
    ReportServer.dbo.SecData AS SD 
     ON C.PolicyID = SD.PolicyID AND SD.AuthType = 1 
     INNER JOIN 
    ReportServer.dbo.DataSource AS DS 
     ON C.ItemID = DS.ItemID 
WHERE 
    DS.Name IS NOT NULL 
ORDER BY 
    DS.Name; 

La página dependiente de artículos en el Administrador de informes ejecuta el dbo.FindItemsByDataSource procedimiento almacenado, el suministro de estos parámetros: ItemID = <data source item ID> y AuthType = 1. La consulta anterior es una versión pirateada de la consulta utilizada por este procedimiento almacenado para eliminar el ID específico del origen de datos. Esto permite que se devuelvan elementos dependientes para todas las fuentes de datos. Quité las fuentes de datos a sí mismos de los resultados con DS.Name IS NOT NULL

+0

Esto se ve genial. Espero que no parezca ignorante aquí, pero ¿cómo puedo ejecutar esto? Mi experiencia hasta ahora ha sido construir y ejecutar SSRS en el servidor. No estoy seguro de cómo ejecutar su consulta. Gracias por adelantado. –

+0

Trate la consulta anterior como si fuera parte de un proyecto de informe normal; Defina el origen de datos, use esta consulta para compilar el conjunto de datos y luego agregue los campos a su informe. Alternativamente, ejecútelo directamente en la base de datos 'ReportServer' utilizando SQL Server Management Studio, Visual Studio u otra herramienta. – Bryan

+0

Muchas gracias ** beargle **, su consulta funcionó a la perfección. Gracias también por tomarse el tiempo para explicar los detalles y cómo ejecutarlo. Extramadamente útil. Gracias de nuevo. –

4

También puede considerar el uso de PowerShell:

#************************************************************************************************************************************ 
# FileName:  Delete-DataSources.ps1 
# Date:   2015/04/23 
# Author:  Hugh Scott 
# 
# Description: 
# This script finds data sources with no dependencies in SSRS and removes them. 
# 
# Parameters: 
# $serverBase  - base URL for the server to check (ie, myserver.mydomain.com) 
# [$WhatIf]  - Option wwitch parameter to prevent actual deleting of objects (will list out reports that need to be deleted) 
#*********************************************************************************************************************************** 
[CmdletBinding()] 
Param(
    [Parameter(Mandatory=$true,Position=0)] 
    [string]$serverBase, 
    [Parameter(Mandatory=$false,Position=1)] 
    [switch]$WhatIf 
) 

$url = "http://$serverBase/reportserver/ReportService2010.asmx?WSDL" 
$ssrs = New-WebServiceProxy -uri $url -UseDefaultCredential -Namespace "ReportingWebService" 

$outFile = ".\DeleteItems_$serverBase.txt" 

# Connection to Web Service, grab all data sources 
$items = $ssrs.ListChildren("/", $true) | where-object {$_.typename -eq "DataSource"} 
foreach($item in $items) { 

    $dependencies = $ssrs.ListDependentItems($item.Path) 
    $dependentReports = $dependencies.Count 

    if($dependencies.Count -eq 0){ 
     [string]$itemName = $item.Path 
     if($WhatIf){ 

      Write-Host "Item $itemName would be deleted." 
      Add-Content $outFile "Item $itemName would be deleted." 
     } else { 
      try { 
       $ssrs.DeleteItem($item.Path) 
       Write-Host "Item $itemName deleted." 
       Add-Content $outFile "Deleted item $itemName ." 
      } catch [System.Exception] { 
       $Msg = $_.Exception.Message 
       Write-Host $itemName $Msg 
       Add-Content $itemName $msg 
      } 
     } 
    } 
} 
Cuestiones relacionadas