首页 > 解决方案 > 使用 invoke-sqlcmd 和 powershell 捕获权限错误

问题描述

我正在运行以下 PowerShell 脚本,令我印象深刻的是它没有捕获特定于权限的错误。我知道错误操作已设置为继续,这是我想要的,但是我想跟踪此类错误,但不要让它们终止我正在运行的循环。

$in_sql_deployment_instance = 'SQL_SERVER'
$target_dba_database = 'TEST'
$query = "RAISERROR (15600,-1,-1, 'mysp_CreateCustomer') WITH log;  "

try{
    $null =  invoke-sqlcmd -ServerInstance "$in_sql_deployment_instance" -Query $query -Database $target_dba_database -Querytimeout 60 -OutputSqlErrors $true -ConnectionTimeout 10 -ErrorAction Continue 

}
catch
{

    $error_message = $_.Exception.Message
    write-output "Error occured $error_message"

}

我在 Ps 控制台上返回错误,但似乎我无法捕获错误等或存储在变量中。

invoke-sqlcmd : Only System Administrator can specify WITH LOG option for RAISERROR command.
At line:2 char:14
+ ...    $null =  invoke-sqlcmd -ServerInstance "$in_sql_deployment_instanc ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

标签: sql-serverpowershell

解决方案


据我所知,为了执行 catch,您需要将您的设置-ErrorActionStop.

我想你可以做的是: set:$ErrorActionPreference = "Continue"在你的 cmdlet 的顶部,然后-ErrorAction stop调用 to invoke-sql,这应该会导致它掉入,catch但继续与continue脚本其余部分中的行为一致。

如果您想离开,另一个选择-ErrorAction continue是也设置-ErrorVariable invokeSqlError然后检查该变量是否包含值。如果确实发生了错误。

就像是:

if ($invokeSqlError){
    write-output "Error occured $invokeSqlError"
}

推荐阅读