【发布时间】: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