我有一个存储过程,可以从某个文件中进行批量插入:
CREATE PROCEDURE [dbo].[SP_BulkInsert] @FileName NVARCHAR(200) AS
BEGIN
DECLARE @bulkinsert NVARCHAR(1000)
SET @bulkinsert = N'BULK INSERT TblTemp FROM ''' + @FileName +
N''' WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'
EXEC sp_executesql @bulkinsert
RETURN @@ROWCOUNT
END
当我从SQL Server Management Studio运行它时,此存储过程运行正常,但是当我尝试使用ExecuteNonQuery
ADO.NET运行它时,我收到以下错误:
“对象'TblTemp',数据库上的INSERT权限被拒绝 'TempDB',架构'dbo'。“
重要:所有其他存储过程(使SELECT/INSERT/DELETE/UPDATE
)在ADO.NET中运行良好。
运行所有内容的用户是bulkadmin
角色的成员,也是自定义db_executer
角色的成员(仅具有EXECUTE权限)。
代码对很多存储过程运行良好,这是第一次失败.. 这是函数
public static int BulkInsert(string fileName)
{
SqlParameter paramFileName = new SqlParameter("FileName", fileName);
SqlParameter paramRetValue = new SqlParameter();
paramRetValue.Direction = ParameterDirection.ReturnValue;
SqlParameter[] @parameters = { paramFileName, paramRetValue };
SqlHelper.ExecuteNonQuery(ConnectionSettings.ConnectionString,
CommandType.StoredProcedure, "SP_BulkInsert", parameters, true);
return (int)paramRetValue.Value;
}
我使用ADO.NET端连接字符串中相同的用户名/密码登录SSMS。
最简单的问题是,为什么在Management Studio中存储过程成功,而通过ADO.NET失败(带有上述错误消息)。
答案 0 :(得分:1)
通过sp_executesql运行SQL使用的权限与直接在存储过程中不同。我建议检查您正在运行存储过程的用户(在此实例中)对表“TblTemp”的INSERT权限。
在Sql Server Management Studio中执行此操作...
答案 1 :(得分:0)
Management Studio必须在具有所有权限的sa帐户上运行,但您通过ADO.NET连接的用户可能没有设置正确的权限。您需要通过Management studio为用户提供写入权限。查看用户列表。