使用模拟的SQLCMD批处理作业

时间:2013-01-23 11:08:10

标签: batch-file impersonation sqlcmd

我有一个批处理文件,为目录中的每个sql文件执行SQLCMD:

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -i"%%G"

但我必须使用模拟,我不想在每个文件中都有这一行。我尝试了两种可能的解决方案。

解决方案1:

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -q "EXECUTE AS LOGIN = 'user2'" -i"%%G" -q "REVERT"

解决方案2:

sqlcmd /S servername /d databaseName -U user -P password -E -q "EXECUTE AS LOGIN = 'user2'"
for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U user -P password -E -i"%%G" 
sqlcmd /S servername /d databaseName -U user -P password -E -q "REVERT"

但两种解决方案都不起作用。在这种情况下该怎么办?

1 个答案:

答案 0 :(得分:1)

来自the manual

  

-i input_file [, input_file2 ...]

     

标识包含一批SQL语句或存储过程的文件。 [...] -i和-Q / -q选项是互斥的

所以你不能以这种方式使用sqlcmd。但您可以使用osql实用程序,但似乎没有此限制,但是,如果您只是在任一解决方案中用sqlcmd替换所有osql条目,它仍然不行。

由于EXECUTE AS的范围是当前会话或当前模块,或者直到REVERT被执行,因此第二种方法无效。由于osql的每次调用都会启动一个新会话,因此与脚本分开调用EXECUTE AS不会对它们产生任何影响。

第一个解决方案不起作用,因为osql将在-q脚本之前执行两个-i命令。因此,您可以在脚本之前有效地更改执行上下文将其还原为

但是,您不需要在每个脚本执行结束时显式调用REVERT。因此,只需采用您的第一个解决方案,将sqlcmd替换为osql,删除-q "REVERT"位并继续使用剩下的内容。