我在T-SQl脚本中使用sqlcmd将文本文件写入网络位置。但是,由于对网络文件夹的访问权限,SQLCMD无法写入该位置。 SP正在我的用户帐户下运行,该帐户可以访问网络文件夹。
如果我没有在TSQL脚本中指定-U和-P选项,请帮助我在哪个帐户下运行sqlcmd?
答案 0 :(得分:5)
使用此命令查找用户名:
PRINT Suser_Sname();
答案 1 :(得分:2)
如果您不使用-u / -p提供凭据,它将尝试使用Windows身份验证;即任何人正在运行它的Windows帐户。
我经常只使用Process Monitor查看正在使用的帐户以及权限错误。
答案 2 :(得分:0)
您说您在T-SQL脚本中使用SQLCMD,难道您不是说您使用SQLCMD来运行T-SQL脚本吗?你的脚本如何编写文本文件?它在SQL Manager中有效吗?我的猜测是SQL Server运行的用户帐户无法访问该位置。
答案 3 :(得分:0)
如果您通过xp_cmdshell
调用不带用户和密码参数的SQL脚本,它将在mssqlserver服务的环境中运行,这是非常受限制的,并且在不更改安全性参数的情况下,您将主要获得“访问权限为否”消息,而不是脚本结果。
为了避免这种安全冲突,我在存储过程create_sql_proc
中使用了以下技巧。我阅读了脚本文件的文本,并通过在其中添加头和脚将其包装在一个过程中。现在,我有了一个脚本,该脚本从名为@procname
的SQL文件创建存储过程。
如果现在让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