使用Powershell执行SQL脚本

时间:2020-09-02 01:36:47

标签: powershell azure-powershell

我正在使用Invoke-Sqlcmd在Powershell中的数据库中执行SQL文件。该SQL文件具有一些SQL过程(如“ USP_UpdateUsers @sss”)和一些直接查询(如“插入表....”)。 我需要的-当使用Powershell执行此sql文件时,过程应该成功执行,但是不应执行诸如“插入表....”之类的直接查询,它应该给出错误。

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

我正在使用这一行代码

  version
0    10.5
1    10.2
2    10.0
3     9.0
4    9.18
5   10.00

m = df.version.str.contains(r'\b\d+.0\b')
df[~m]

Out[54]:
  version
0    10.5
1    10.2
4    9.18
5   10.00

1 个答案:

答案 0 :(得分:0)

如果适合创建角色,请与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语句的情况下才执行该文件。您可以外推以满足其他DELETEUPDATE之类的DML语句。

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

    }
    
}