使用Powershell执行SQL脚本



我正在Powershell中使用Invoke-Sqlcmd执行数据库中的SQL文件。该SQL文件具有一些SQL过程;USP_UpdateUsers@sss";以及一些直接查询,如";插入表格"我需要的是-当这个sql文件使用Powershell执行时,过程应该成功执行,但直接查询如";插入表格"不应该执行,它应该给出错误。

SQL角色只能为执行SQL过程创建,但我不希望为执行此过程创建任何单独的SQL角色。请告诉我使用Invoke-Sqlcmd有什么方法可以处理这种情况吗?

我正在使用这行代码

Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db3 -InputFile $_.FullName -username $username -password $password -verbose *> $outputFileName

在与DBA讨论后,如果您可以创建角色:

为了限制用户不执行语句,您可以执行以下步骤:

  1. 首先创建角色,该角色将用于执行脚本
CREATE ROLE ScriptExecutor;
  1. 现在,为角色分配权限。要授予用户的特定权限
GRANT CREATE PROCEDURE TO ScriptExecutor
GRANT CREATE VIEW TO ScriptExecutor
  1. 现在,应该将要执行脚本的用户添加到角色中
ALTER ROLE ScriptExecutor ADD MEMBER UserName
  1. 现在,这个用户可以用来执行powershell脚本。现在,该用户将无法执行INSERT语句
Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db3 -InputFile $_.FullName -username $username -password $password -verbose *> $outputFileName

如果您不想创建SQL角色:

您可以有一个powershell脚本,它在SQL文件中循环,并且只有在没有INSERT语句的情况下才执行该文件。您可以进行外推以满足进一步的DML语句,如DELETEUPDATE

foreach($file in Get-childitem C:dev -Filter *.sql)
{
if((select-string -Path $file -Pattern "INSERT") -ne $null)
{
"The file $file contains INSERT Statement. So, will not be executed" | out-File $outputFileName -Append
}
else
{
Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db3 -InputFile $File -username $username -password $password -verbose *> $outputFileName
}

}

最新更新