哪个用户帐户在没有-U和-P选项的T-SQL脚本中运行SQLCMD?

时间:2010-03-19 10:37:57

标签: sql sql-server sqlcmd

我在T-SQl脚本中使用sqlcmd将文本文件写入网络位置。但是,由于对网络文件夹的访问权限,SQLCMD无法写入该位置。 SP正在我的用户帐户下运行,该帐户可以访问网络文件夹。

如果我没有在TSQL脚本中指定-U和-P选项,请帮助我在哪个帐户下运行sqlcmd?

4 个答案:

答案 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