首页 > 解决方案 > 使用 Powershell 执行 SQL 脚本

问题描述

我正在使用 Invoke-Sqlcmd 在 Powershell 的数据库中执行 SQL 文件。这个 SQL 文件有一些 SQL 过程,如“USP_UpdateUsers @sss”和一些直接查询,如“插入表......”我需要什么 - 当这个 sql 文件使用 Powershell 执行时,程序应该成功执行,但直接查询如“ Insert into table ...." 不应该被执行,它应该给出错误。

只能为 SQL 过程执行创建 SQL 角色,但我不希望任何单独的 SQL 角色用于此执行。请让我知道有没有办法使用 Invoke-Sqlcmd 来处理这种情况?

我正在使用这行代码

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

标签: powershellazure-powershell

解决方案


如果您可以创建角色,在与 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 语句,如DELETE, UPDATE

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

    }
    
}

推荐阅读