问题描述
我正在使用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
解决方法
如果适合创建角色,请与DBA讨论后:
要限制用户不执行语句,可以执行以下步骤:
- 第一个创建角色,将用于执行脚本
CREATE ROLE ScriptExecutor;
- 现在,为角色分配权限。您要授予用户的特定权限。
GRANT CREATE PROCEDURE TO ScriptExecutor
GRANT CREATE VIEW TO ScriptExecutor
- 现在,应该将要执行脚本的用户添加到角色中。
ALTER ROLE ScriptExecutor ADD MEMBER UserName
- 现在,可以使用该用户执行powershell脚本。现在,该用户将无法执行INSERT语句。
Invoke-Sqlcmd -ServerInstance $SQLServer -Database $db3 -InputFile $_.FullName -username $username -password $password -verbose *> $outputFileName
如果您不想创建SQL角色:
您可以拥有一个Powershell脚本,该脚本循环遍历SQL文件,并且仅在没有INSERT
语句的情况下才执行该文件。您可以外推以满足其他DELETE
,UPDATE
之类的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
}
}