Jun 12, 2026, 8:29 AM
This commit is contained in:
@@ -86,10 +86,37 @@ function Get-SQLDatabases {
|
||||
try {
|
||||
$connection.Open()
|
||||
|
||||
# Query databases from sys.databases joined with sys.master_files to correctly sum file sizes.
|
||||
# sys.databases does not have a "size" column. We must group and sum size from sys.master_files.
|
||||
$cmd = $connection.CreateCommand()
|
||||
# Primary query including backups
|
||||
$cmd.CommandText = @"
|
||||
SELECT
|
||||
d.name,
|
||||
d.state_desc,
|
||||
COALESCE(SUM(CAST(f.size AS FLOAT) * 8.0 / 1024.0), 0.0) as size_mb,
|
||||
d.recovery_model_desc,
|
||||
(
|
||||
SELECT MAX(b.backup_finish_date)
|
||||
FROM msdb.dbo.backupset b
|
||||
WHERE b.database_name = d.name AND b.type = 'D'
|
||||
) AS last_full_backup,
|
||||
(
|
||||
SELECT MAX(b.backup_finish_date)
|
||||
FROM msdb.dbo.backupset b
|
||||
WHERE b.database_name = d.name AND b.type = 'L'
|
||||
) AS last_log_backup
|
||||
FROM sys.databases d
|
||||
LEFT JOIN sys.master_files f ON d.database_id = f.database_id
|
||||
GROUP BY d.name, d.state_desc, d.recovery_model_desc
|
||||
"@
|
||||
|
||||
$adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd)
|
||||
$table = New-Object System.Data.DataTable
|
||||
try {
|
||||
$null = $adapter.Fill($table)
|
||||
$hasBackups = $true
|
||||
} catch {
|
||||
# Fallback to query without backups if we don't have access to msdb or backupset table
|
||||
$cmd.CommandText = @"
|
||||
SELECT
|
||||
d.name,
|
||||
d.state_desc,
|
||||
@@ -99,10 +126,10 @@ FROM sys.databases d
|
||||
LEFT JOIN sys.master_files f ON d.database_id = f.database_id
|
||||
GROUP BY d.name, d.state_desc, d.recovery_model_desc
|
||||
"@
|
||||
|
||||
$adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd)
|
||||
$table = New-Object System.Data.DataTable
|
||||
$null = $adapter.Fill($table)
|
||||
$table.Clear()
|
||||
$null = $adapter.Fill($table)
|
||||
$hasBackups = $false
|
||||
}
|
||||
|
||||
$dbList = @()
|
||||
foreach ($row in $table.Rows) {
|
||||
@@ -115,11 +142,37 @@ GROUP BY d.name, d.state_desc, d.recovery_model_desc
|
||||
$dbStatus = if ($row.state_desc -ne [System.DBNull]::Value -and $row.state_desc -ne $null) { $row.state_desc.ToString() } else { "Unknown" }
|
||||
$dbRecovery = if ($row.recovery_model_desc -ne [System.DBNull]::Value -and $row.recovery_model_desc -ne $null) { $row.recovery_model_desc.ToString() } else { "Simple" }
|
||||
|
||||
$fullBackup = "Unknown"
|
||||
$logBackup = "Unknown"
|
||||
|
||||
if ($hasBackups) {
|
||||
$fullBackup = "Never"
|
||||
if ($row.Table.Columns.Contains("last_full_backup") -and $row.last_full_backup -ne [System.DBNull]::Value -and $row.last_full_backup -ne $null) {
|
||||
$fullBackup = ([datetime]$row.last_full_backup).ToString("yyyy-MM-dd HH:mm:ss")
|
||||
}
|
||||
|
||||
$logBackup = "Never"
|
||||
if ($dbRecovery -eq "SIMPLE") {
|
||||
$logBackup = "N/A (Simple)"
|
||||
} elseif ($row.Table.Columns.Contains("last_log_backup") -and $row.last_log_backup -ne [System.DBNull]::Value -and $row.last_log_backup -ne $null) {
|
||||
$logBackup = ([datetime]$row.last_log_backup).ToString("yyyy-MM-dd HH:mm:ss")
|
||||
}
|
||||
} else {
|
||||
$fullBackup = "N/A (No Access)"
|
||||
if ($dbRecovery -eq "SIMPLE") {
|
||||
$logBackup = "N/A (Simple)"
|
||||
} else {
|
||||
$logBackup = "N/A (No Access)"
|
||||
}
|
||||
}
|
||||
|
||||
$dbList += [pscustomobject]@{
|
||||
Name = $dbName
|
||||
Status = $dbStatus
|
||||
Size = "$([Math]::Round($sizeVal, 2)) MB"
|
||||
RecoveryModel = $dbRecovery
|
||||
LastFullBackup = $fullBackup
|
||||
LastLogBackup = $logBackup
|
||||
}
|
||||
}
|
||||
return $dbList
|
||||
|
||||
Reference in New Issue
Block a user