bin/Public/Find-sqmDatabaseObject.ps1
|
<#
.SYNOPSIS Durchsucht alle (oder ausgewaehlte) Datenbanken einer Instanz nach einem Objektnamen. .DESCRIPTION Sucht in Benutzerdatenbanken nach Tabellen, Sichten, Prozeduren, Funktionen, Triggern, Synonymen. Liefert Fundort (Datenbank, Schema, Objekttyp, Name). Kann nach SQL-Text (vollstaendige Definition) filtern. .PARAMETER SqlInstance SQL Server-Instanz (Standard: aktueller Computername). .PARAMETER SqlCredential PSCredential fuer die Verbindung. .PARAMETER ObjectName Name des gesuchten Objekts oder Wildcard (z.B. '*customer*'). .PARAMETER ObjectType Einschraenkung auf Typ: 'TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'TRIGGER', 'SYNONYM'. Mehrfach moeglich als Array. .PARAMETER Database Datenbanken durchsuchen (Wildcard, Standard: alle Benutzerdatenbanken). .PARAMETER IncludeSystem Systemdatenbanken einbeziehen. Standard: $false. .PARAMETER SearchDefinition Wenn $true, wird auch der Objekttext (Definition) nach <ObjectName> durchsucht (langsamer). .PARAMETER EnableException Ausnahmen sofort ausloesen. .EXAMPLE Find-sqmDatabaseObject -SqlInstance "SQL01" -ObjectName "sp_GetOrders" .EXAMPLE Find-sqmDatabaseObject -SqlInstance "SQL01" -ObjectName "*log*" -ObjectType "TABLE","VIEW" -Database "Sales*" .NOTES Verwendet sys.objects und sys.sql_modules (fuer Definition). #> function Find-sqmDatabaseObject { [CmdletBinding()] [OutputType([PSCustomObject])] param ( [Parameter(Mandatory = $true)] [string]$ObjectName, [Parameter(Mandatory = $false)] [string]$SqlInstance = $env:COMPUTERNAME, [Parameter(Mandatory = $false)] [System.Management.Automation.PSCredential]$SqlCredential, [Parameter(Mandatory = $false)] [string[]]$ObjectType, [Parameter(Mandatory = $false)] [string]$Database = '*', [Parameter(Mandatory = $false)] [switch]$IncludeSystem, [Parameter(Mandatory = $false)] [switch]$SearchDefinition, [Parameter(Mandatory = $false)] [switch]$EnableException ) begin { $functionName = $MyInvocation.MyCommand.Name if (-not $script:dbatoolsAvailable) { $errMsg = "dbatools-Modul nicht gefunden. Bitte installieren: Install-Module dbatools" Invoke-sqmLogging -Message $errMsg -FunctionName $functionName -Level "ERROR" throw $errMsg } $allResults = [System.Collections.Generic.List[PSCustomObject]]::new() } process { try { # Get-DbaDatabase unterstuetzt keine Wildcards im -Database-Parameter. # Daher: alle Datenbanken laden und anschliessend per -like filtern. $allDbs = Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential ` -ExcludeSystem:(-not $IncludeSystem) -ErrorAction Stop $dbList = if ($Database -eq '*') { $allDbs } else { $allDbs | Where-Object { $_.Name -like $Database } } if (-not $dbList) { Invoke-sqmLogging -Message "Keine Datenbanken auf '$SqlInstance' gefunden (Filter: '$Database')." ` -FunctionName $functionName -Level "WARNING" return $allResults } $typeFilter = if ($ObjectType) { "AND type_desc IN ('$($ObjectType -join "','")')" } else { "" } $searchName = $ObjectName -replace "'", "''" if ($SearchDefinition) { $query = @" SELECT DB_NAME() AS DatabaseName, SCHEMA_NAME(schema_id) AS SchemaName, o.name AS ObjectName, o.type_desc AS ObjectType, LEFT(m.definition, 500) AS DefinitionPreview FROM sys.objects o LEFT JOIN sys.sql_modules m ON o.object_id = m.object_id WHERE o.name LIKE '$searchName' OR m.definition LIKE '%$searchName%' $typeFilter "@ } else { $query = @" SELECT DB_NAME() AS DatabaseName, SCHEMA_NAME(schema_id) AS SchemaName, o.name AS ObjectName, o.type_desc AS ObjectType, NULL AS DefinitionPreview FROM sys.objects o WHERE o.name LIKE '$searchName' $typeFilter "@ } foreach ($db in $dbList) { try { $rows = Invoke-DbaQuery -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $db.Name -Query $query -ErrorAction Stop foreach ($row in $rows) { $allResults.Add([PSCustomObject]@{ SqlInstance = $SqlInstance Database = $row.DatabaseName Schema = $row.SchemaName ObjectName = $row.ObjectName ObjectType = $row.ObjectType DefinitionPreview = $row.DefinitionPreview }) } } catch { Invoke-sqmLogging -Message "Fehler in DB $($db.Name): $($_.Exception.Message)" -FunctionName $functionName -Level "WARNING" if ($EnableException) { throw } } } return $allResults } catch { Invoke-sqmLogging -Message $_.Exception.Message -FunctionName $functionName -Level "ERROR" if ($EnableException) { throw } return $null } } } |