PayrollManagementSystem/scripts/tplus/inventory_tplus_database.ps1
liuwenxin b0c599e513 fix(脚本): 收紧 T+ 运维脚本校验与恢复行为
login 脚本原先在结尾无条件 SET READ_ONLY:库名误指向其他
可写库时会把它锁成只读。改为开头校验库存在(不存在即中止)
并记录初始 Updateability,结尾仅当初始为 READ_ONLY 时恢复。
inventory 脚本的库名校验统一为 restore 脚本的字符白名单。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-30 09:57:30 +08:00

79 lines
2.8 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[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"