SQL Server-您无权使用批量加载语句

时间:2019-03-21 15:37:27

标签: sql-server permissions bulkinsert

使用SQL Server 2016,我正在尝试配置除“ SA”以外的其他用户来导入文件。我正在执行的代码如下:

EXECUTE AS USER = 'DataImports';

SELECT  CURRENT_USER;

EXEC xp_cmdshell 'TYPE myFileNameHere.txt'

BULK INSERT DataImports.staging_AddressBook
FROM 'myFileNameHere.txt'
WITH (DATAFILETYPE = 'char'
,     FIRSTROW = 2
,     FIELDTERMINATOR = ' '
,     ROWTERMINATOR = '\n');

我得到的错误是:

  

消息4834,第16级,状态1,第20行
  您无权使用批量加载语句。

我已经验证了以下内容:

  • 我确实可以根据用户的需要访问文件-cmdshell TYPE返回预期的行。我似乎没有文件访问问题。
  • 我一般对数据库拥有INSERT权限。

我通过以下方式进行了测试:

SELECT      
    [DatabaseUserName] = princ.[name],
    [PermissionType]   = perm.[permission_name],
    [PermissionState]  = perm.[state_desc]
FROM      
    sys.database_principals  princ
LEFT JOIN 
    sys.database_permissions perm ON perm.[grantee_principal_id] = princ.[principal_id]
WHERE      
    princ.[name] = 'DataImports';`

Permissions

  • 我确实具有批量管理员角色

    SELECT
        r.name AS [RoleName],
        m.name AS [MemberName],
        CASE 
           WHEN m.name IS NOT NULL THEN 1 ELSE 0 
        END AS IsMember
    FROM      
        sys.server_principals r
    LEFT JOIN 
        sys.server_role_members rm ON (r.principal_id = rm.role_principal_id)
    LEFT JOIN 
        sys.server_principals m ON (rm.member_principal_id = m.principal_id)
    WHERE      
        r.type = 'R' AND m.name = 'Dataimports';
    

    Roles

我什至将用户配置为系统管理员(不是长期计划的一部分),但仍然出现错误。

这些是我在其他SO凭单和常规搜索中突出显示的要点。尽管看起来是正确的配置,但我可以将表导入为SA,但不能导入为DataImports

这是正在运行的作业的一部分,当前,我们仅授予SA访问权限即可读取文件。从安全角度来看,这不是理想的选择,但我无法确定缺少的内容。

我们将不胜感激地提出任何关于其他检查内容的建议-所有基本知识都已准备就绪。

1 个答案:

答案 0 :(得分:1)

  

任何建议   其他检查内容将不胜感激-所有基本知识   似乎已经到位。

几件事:

GRANT ADMINISTER BULK OPERATIONS TO Dataimports

如果目标表包含触发器或检查约束

GRANT ALTER ON TABLE DataImports.staging_AddressBook TO Dataimports

ALTER DATABASE [yourDB] SET TRUSTWORTHY ON;

原因:

  

出于安全考虑,服务器范围的权限为   冒充数据库用户时将其剥离,除非系统   管理员已将SQL Server显式设置为信任模拟用户   服务器范围内的上下文。在这种情况下,使用控件登录   服务器服务器范围的权限无权访问任何   特定的数据库。因此,触发模块执行为   此登录无法运行。