我在 T-SQl 脚本中使用 sqlcmd 将文本文件写入网络位置。但是,由于对网络文件夹的访问权限,SQLCMD 无法写入该位置。SP 正在我可以访问网络文件夹的用户帐户下运行。
如果我没有在 TSQL 脚本中指定 -U 和 -P 选项,你能帮我在哪个帐户下运行 sqlcmd 吗?
我在 T-SQl 脚本中使用 sqlcmd 将文本文件写入网络位置。但是,由于对网络文件夹的访问权限,SQLCMD 无法写入该位置。SP 正在我可以访问网络文件夹的用户帐户下运行。
如果我没有在 TSQL 脚本中指定 -U 和 -P 选项,你能帮我在哪个帐户下运行 sqlcmd 吗?
使用它来查找用户名:
PRINT Suser_Sname();
如果您不使用 -u/-p 提供凭据,它将尝试使用 Windows 身份验证;即运行它的任何人的 Windows 帐户。
我经常只是使用进程监视器来查看正在使用的帐户以及权限错误是什么。
你说你在 T-SQL 脚本中使用 SQLCMD,你不是说你在使用 SQLCMD 来运行 T-SQL 脚本吗?您的脚本如何编写文本文件?它在 SQL 管理器中工作吗?我的猜测是运行 SQL Server 的用户帐户无权访问该位置。
如果您通过没有用户和密码参数调用 SQL 脚本xp_cmdshell
,它将在 mssqlserver 服务的环境中运行,这是非常受限制的,并且在不更改安全参数的情况下,您将主要收到“访问被拒绝”消息而不是结果剧本。
为了避免这种安全冲突情况,我在存储过程中使用了以下技巧create_sql_proc
。我阅读了脚本文件的文本,并通过为其添加头和脚将其包装在一个过程中。现在我有一个脚本,它从名为@procname
. 如果您现在让运行此存储过程EXEC @procname
,它将在您的安全环境中运行,并提供您通过从命令提示符运行它获得的结果:
CREATE PROCEDURE create_sql_proc(@procName sysname, @sqlfile sysname) AS
BEGIN
DECLARE @crlf nvarchar(2) = char(10)+char(13)
DECLARE @scriptText nvarchar(max)
DECLARE @cmd nvarchar(max)
= N'SET @text = (SELECT * FROM openrowset(BULK '''+@sqlFile+''', SINGLE_CLOB) as script)'
EXEC sp_executesql @cmd , N'@text nvarchar(max) output', @text = @scriptText OUTPUT
DECLARE @ProcHead nvarchar(max) = N'CREATE or ALTER PROCEDURE '+@procName+ ' AS '+@crlf+'BEGIN'+@crlf
DECLARE @ProcTail nvarchar(max) = @crlf + N'END '
SET @scriptText = @ProcHead + @scriptText + @ProcTail
-- create TestGen stored procedure --
EXEC sys.sp_executesql @scriptText
END