login 脚本原先在结尾无条件 SET READ_ONLY:库名误指向其他 可写库时会把它锁成只读。改为开头校验库存在(不存在即中止) 并记录初始 Updateability,结尾仅当初始为 READ_ONLY 时恢复。 inventory 脚本的库名校验统一为 restore 脚本的字符白名单。 Co-Authored-By: Claude Code <noreply@anthropic.com>
79 lines
2.8 KiB
PowerShell
79 lines
2.8 KiB
PowerShell
[CmdletBinding()]
|
||
param(
|
||
[Parameter(Mandatory = $true)]
|
||
[string]$DatabaseName,
|
||
[string]$ContainerName = "ys-tplus-sqlserver-dev",
|
||
[string]$ReportRoot = "D:\work\app\tplus-sqlserver\reports",
|
||
[Parameter(Mandatory = $true)]
|
||
[SecureString]$SaPassword
|
||
)
|
||
|
||
Set-StrictMode -Version Latest
|
||
$ErrorActionPreference = "Stop"
|
||
|
||
. (Join-Path $PSScriptRoot "container_sql.ps1")
|
||
|
||
if ($DatabaseName -notmatch '^[A-Za-z_][A-Za-z0-9_]{0,127}$') {
|
||
throw "核验数据库名只能使用字母、数字和下划线。"
|
||
}
|
||
|
||
New-Item -ItemType Directory -Path $ReportRoot -Force | Out-Null
|
||
$reportPath = Join-Path $ReportRoot ("Tplus-核验-{0:yyyyMMdd-HHmmss}.md" -f (Get-Date))
|
||
$safeDatabaseIdentifier = $DatabaseName.Replace("]", "]]" )
|
||
$safeDatabaseLiteral = $DatabaseName.Replace("'", "''")
|
||
|
||
$sql = @"
|
||
USE [$safeDatabaseIdentifier];
|
||
SET NOCOUNT ON;
|
||
SELECT 'DATABASE' AS section_name, DB_NAME() AS item_name, CAST(SUM(size) * 8.0 / 1024 AS varchar(64)) AS detail
|
||
FROM sys.database_files;
|
||
SELECT 'TABLE' AS section_name, s.name + '.' + t.name AS item_name,
|
||
CAST(SUM(p.rows) AS varchar(64)) AS detail
|
||
FROM sys.tables t
|
||
JOIN sys.schemas s ON s.schema_id = t.schema_id
|
||
LEFT JOIN sys.partitions p ON p.object_id = t.object_id AND p.index_id IN (0, 1)
|
||
GROUP BY s.name, t.name
|
||
ORDER BY s.name, t.name;
|
||
SELECT 'COLUMN' AS section_name,
|
||
s.name + '.' + t.name + '.' + c.name AS item_name,
|
||
ty.name + '(' + CAST(c.max_length AS varchar(16)) + ')' AS detail
|
||
FROM sys.columns c
|
||
JOIN sys.tables t ON t.object_id = c.object_id
|
||
JOIN sys.schemas s ON s.schema_id = t.schema_id
|
||
JOIN sys.types ty ON ty.user_type_id = c.user_type_id
|
||
ORDER BY s.name, t.name, c.column_id;
|
||
SELECT 'VIEW' AS section_name, s.name + '.' + v.name AS item_name, 'view' AS detail
|
||
FROM sys.views v JOIN sys.schemas s ON s.schema_id = v.schema_id
|
||
ORDER BY s.name, v.name;
|
||
SELECT 'PROCEDURE' AS section_name, s.name + '.' + p.name AS item_name, 'procedure' AS detail
|
||
FROM sys.procedures p JOIN sys.schemas s ON s.schema_id = p.schema_id
|
||
ORDER BY s.name, p.name;
|
||
"@
|
||
|
||
$output = Invoke-TPlusContainerSql -ContainerName $ContainerName -Sql $sql -SaPassword $SaPassword
|
||
|
||
$header = @(
|
||
"# T+ 数据库恢复核验报告",
|
||
"",
|
||
"- 数据库:$DatabaseName",
|
||
"- 容器:$ContainerName",
|
||
"- 核验时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')",
|
||
"- 数据目录:D:\work\app\tplus-sqlserver\data",
|
||
"- 日志目录:D:\work\app\tplus-sqlserver\log",
|
||
"",
|
||
"## 查询结果",
|
||
"",
|
||
'```text'
|
||
)
|
||
$footer = @(
|
||
'```',
|
||
"",
|
||
"## 后续核对",
|
||
"",
|
||
"- 对照 T+ 12.3 字段映射草案核对六类源表。",
|
||
"- 记录更新时间字段、关联键、负向单据和枚举值。",
|
||
"- 未确认字段不得直接写入工资业务表。"
|
||
)
|
||
($header + @($output) + $footer) | Set-Content -LiteralPath $reportPath -Encoding utf8
|
||
Write-Host "核验报告已生成:$reportPath"
|