gpt4 book ai didi

sql-server - 将错误写入日志后退出脚本

转载 作者:行者123 更新时间:2023-12-03 11:20:25 31 4
gpt4 key购买 nike

我正在编写一个脚本来将一堆 sql 文件部署到 sql server。要求是:

  1. 一切都应该写入日志文件
  2. 脚本应该在遇到错误时结束(逻辑是我们修复它然后再次重新运行脚本)。

我有一个函数可以从文件夹中运行一堆 sql 文件。

function writeLog($comment,
$logfile="C:\Users\ndefontenay\Documents\Releases\logs\release-update.log"){
$date=Get-Date -Format "MM/dd/yyyy HH:mm:ss"
$fullComment="$date - $comment"
$fullComment | Out-File -Append $logfile
}

function runQueriesInFolder($folder, $server=".",$database){
Write-Host $folder
$files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending
foreach ($file in $files){
invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536
}
}

太好了。这将退出并在控制台中写入一些错误。但我需要记录错误,所以我使用 try..catch。

function runQueriesInFolder($folder, $server=".",$database){
Write-Host $folder
$files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending
try{
foreach ($file in $files){
invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536
}
}
catch{
WriteLog("ERROR - $($_)")
}
}

现在我的错误记录在日志中,但脚本不再退出。所以我尝试使用“finally”语句。它似乎并没有更好地工作。

function runQueriesInFolder($folder, $server=".",$database){
Write-Host $folder
$files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending
try{
foreach ($file in $files){
invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536
}
}
catch{
WriteLog("ERROR - $($_)")
}
finally{
exit 1
}
}

错误日志应该在记录第一个错误无效对象名称时结束:

07/23/2015 10:57:45 - ERROR - Invalid object name 'History.DOS.Test'.
07/23/2015 10:57:45 - ERROR - Cannot open database "blah" requested by the login. The login failed.
07/23/2015 10:57:45 - ERROR - The 'Query' and the 'InputFile' options are mutually exclusive.
07/23/2015 10:57:45 - Release update completed

所以问题是:如何让我的应用程序将停止错误记录到文件中,并完全退出脚本?

最佳答案

Now my errors are written in the logs but the script doesn't exit anymore.

那是因为您的 catch block 正在处理错误并且没有采取任何行动。

如果你想重新抛出错误,那么就这样做:

catch{
WriteLog("ERROR - $($_)")
throw
}

现在您的错误将被记录下来,并且 catch block 将重新抛出错误以使其冒泡。

就“冒泡”错误而言,调用代码应该处理它。调用代码可能想要相应地处理异常,或者它可能只是退出脚本。

# calling code
try {
runQueriesInFolder(...)
}
catch {
# hit an error, don't want to keep script running
exit
}

关于sql-server - 将错误写入日志后退出脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31595518/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com