powershell - 使用 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
解决方案
如果您可以创建角色,在与 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
语句时才执行该文件。您可以推断以满足进一步的 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
}
}
推荐阅读
- javascript - React TS - TypeWriter 组件
- laravel - Laravel - cache:clear 命令是否也会清除配置缓存?
- python - 如何验证请求正文是进入 python 烧瓶应用程序的有效 JSON
- spring-boot - 发送html电子邮件的问题
- automation - 空手道 UI 拖放
- ffmpeg - ffmpeg 图像生成输出结果
- java - 检查 char[] 是否仅包含一个字母和一个 int
- scala - 如何在不执行的情况下获取 spark sql 查询的列
- python - 如何合并两个大小不等的数据框
- flutter - Flutter:如何使用 ListTile 作为子项创建 DropdownMenuItem