【问题标题】:SQL Server - You do not have permission to use the bulk load statementSQL Server - 您无权使用批量加载语句
【发布时间】:2019-03-21 15:37:27
【问题描述】:

使用 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 类型返回预期的行。我似乎没有文件访问问题。
  • 我一般拥有数据库的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';`

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

    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';
    

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

这些是在我执行的其他 SO 票证和一般搜索中突出显示的要点。尽管配置似乎正确,但我可以将表导入为SA,但不能导入为DataImports。

这是正在运行的作业的一部分,目前我们必须授予 SA 访问权限才能读取文件。安全方面,这不太理想,但我无法弄清楚缺少什么。

我们将不胜感激地收到任何关于其他检查的建议 - 所有基础似乎都已到位。

【问题讨论】:

    标签: sql-server permissions bulkinsert


    【解决方案1】:

    任何建议 其他要检查的内容将不胜感激-所有基础知识 似乎就位。

    几件事:

    GRANT ADMINISTER BULK OPERATIONS TO Dataimports
    

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

    GRANT ALTER ON TABLE DataImports.staging_AddressBook TO Dataimports
    

    和

    ALTER DATABASE [yourDB] SET TRUSTWORTHY ON;
    

    因为:

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

    【讨论】:

    • 我已经接受了这个作为答案,因为它解决了我看到的问题,但是在盲目接受之前我会提醒其他人。将 trustworthy 设置为 on 确实会产生一个安全漏洞,因此 db_owner 模式中的用户可以将自己注册为系统管理员并控制服务器。这种特殊情况不会出现在我们的设置中,但在实施更改之前值得了解。可以在此处查看详细信息:red-gate.com/simple-talk/blogs/careful-trustworthy-setting
    • @MatthewBaker, SET TRUSTWORTHY ON; 仅在您运行用户模拟时才需要。我相信,如果你直接使用账号DataImports登录,这样的措施是不需要的..
    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多