使用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行
您无权使用批量加载语句。
我已经验证了以下内容:
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访问权限即可读取文件。从安全角度来看,这不是理想的选择,但我无法确定缺少的内容。
我们将不胜感激地提出任何关于其他检查内容的建议-所有基本知识都已准备就绪。
答案 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显式设置为信任模拟用户 服务器范围内的上下文。在这种情况下,使用控件登录 服务器服务器范围的权限无权访问任何 特定的数据库。因此,触发模块执行为 此登录无法运行。