diff --git a/scripts/tplus/create_tplus_readonly_login.ps1 b/scripts/tplus/create_tplus_readonly_login.ps1 index 2562fc9..521f64c 100644 --- a/scripts/tplus/create_tplus_readonly_login.ps1 +++ b/scripts/tplus/create_tplus_readonly_login.ps1 @@ -30,7 +30,14 @@ $safeDatabaseLiteral = $DatabaseName.Replace("'", "''") $safeLoginIdentifier = $LoginName.Replace("]", "]]" ) $safeReaderPassword = $readerPasswordText.Replace("'", "''") $sql = @" -IF DATABASEPROPERTYEX(N'$safeDatabaseLiteral', 'Updateability') = N'READ_ONLY' +IF DB_ID(N'$safeDatabaseLiteral') IS NULL +BEGIN + ;THROW 51000, N'目标数据库不存在,已停止配置,未修改任何库。', 1; +END; +DECLARE @initialReadonly bit = + CASE WHEN CAST(DATABASEPROPERTYEX(N'$safeDatabaseLiteral', 'Updateability') AS nvarchar(30)) = N'READ_ONLY' + THEN 1 ELSE 0 END; +IF @initialReadonly = 1 ALTER DATABASE [$safeDatabaseIdentifier] SET READ_WRITE; IF NOT EXISTS (SELECT 1 FROM sys.server_principals WHERE name = N'$safeLoginIdentifier') BEGIN @@ -49,8 +56,9 @@ IF NOT EXISTS ( ) EXEC sp_addrolemember N'db_datareader', N'$safeLoginIdentifier'; DENY INSERT, UPDATE, DELETE TO [$safeLoginIdentifier]; -ALTER DATABASE [$safeDatabaseIdentifier] SET READ_ONLY; +IF @initialReadonly = 1 + ALTER DATABASE [$safeDatabaseIdentifier] SET READ_ONLY; "@ Invoke-TPlusContainerSql -ContainerName $ContainerName -Sql $sql -SaPassword $SaPassword -Write-Host "只读账号已配置:$LoginName(未输出密码)" +Write-Host "只读账号已配置:$LoginName(未输出密码)。仅当目标库初始为 READ_ONLY 时才恢复只读;初始为可写的库保持可写。" diff --git a/scripts/tplus/inventory_tplus_database.ps1 b/scripts/tplus/inventory_tplus_database.ps1 index 1931ef0..f1d5e74 100644 --- a/scripts/tplus/inventory_tplus_database.ps1 +++ b/scripts/tplus/inventory_tplus_database.ps1 @@ -13,6 +13,10 @@ $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("]", "]]" )