如何允许非管理员用户在Azure SQL数据库上使用BULK INSERT

时间:2018-03-20 10:22:22

标签: azure permissions azure-sql-database bulkinsert

我目前正在努力让BULK INSERT使用admin用户在没有的情况下使用Azure SQL数据库。以下脚本正常工作,与管理员用户执行时documented完全符合预期:

-- Note: this requires a MASTER KEY to exist!
-- If you don't have a master key yet, create one with the following statement:
--CREATE MASTER KEY;

CREATE DATABASE SCOPED CREDENTIAL StorageCredential WITH
    IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = '<my-blob-storage-sas>';

CREATE EXTERNAL DATA SOURCE StorageContainerDataSource WITH (
    TYPE = BLOB_STORAGE,
    LOCATION = 'https://<blob-storage-account>.blob.core.windows.net/bulk',
    CREDENTIAL = StorageCredential
);

CREATE TABLE [#TestFacts] (
    [Id] uniqueidentifier,
    [MachineId] uniqueidentifier,
    [TimeZone] nvarchar(50),
    [SliceDate] datetime2(7),
    [SliceTimeStamp] datetime2(7),
    [Weight] bigint,
    [UserId] uniqueidentifier,
    [Longitude] float,
    [Latitude] float
);

BULK INSERT [#TestFacts]
FROM 'test.csv'
WITH (
    DATA_SOURCE = 'StorageContainerDataSource',
    FORMAT = 'CSV',
    DATAFILETYPE = 'char',
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR = '0x0a',
    KEEPIDENTITY,
    KEEPNULLS
);

DROP TABLE [#TestFacts];
DROP EXTERNAL DATA SOURCE StorageContainerDataSource;
DROP DATABASE SCOPED CREDENTIAL StorageCredential;

当执行此作为非管理员用户,已被授予SELECT,UPDATE,DELETE,INSERT,ALTER,CONTROL和ADMINISTER DATABASE BULK OPERATIONS时,我收到以下错误消息:

Msg 4834, Level 16, State 1, Line 26
You do not have permission to use the bulk load statement.

根据文档,拥有INSERT,ALTER和最重要的ADMINISTER DATABASE BULK OPERATIONS权限应该足够了。但是在检查数据库权限时(在sys.database_permissions中),我可以看到GRANT ADMINISTER DATABASE BULK OPERATIONS TO myUser添加了以下行:

principal_id  name    type_desc  authentication_type_desc  class_desc  type  permission_name  state_desc  major_id  minor_id
6             myUser  SQL_USER   DATABASE                  DATABASE          NULL             GRANT       0         0

请注意,type为空,permission_name为NULL!根据{{​​3}},这应该是DABOADMINISTER DATABASE BULK OPERATIONS

所以我现在的问题是:这是Azure SQL数据库中的错误吗?有什么我忘了做的吗?非管理员用户实际上不支持BULK INSERT吗?

一些注意事项:

  • @@VERSION是“Microsoft SQL Azure(RTM) - 12.0.2000.8 Jan 26 2018 23:35:00“和SERVERPROPERTY('EngineEdition')是”5“。
  • 我在类似问题上找到的所有资源都谈到了SQL Server,在这里您需要拥有角色bulkadmin或者需要向用户授予ADMINISTER BULK OPERATIONS(请注意DATABASE缺失!)。但Azure SQL数据库既没有。

1 个答案:

答案 0 :(得分:1)

这是example on the Microsoft github account,其中包含非常重要的信息:

  

创建永久表。目前不支持临时表   BULK INSERT,虽然它可以与OPENROWSET一起使用

因此,可以通过从表名中删除#来解决问题,使其成为永久表。然后,即使对于非管理员用户,一切都按预期工作并记录下来。

注意:示例中的引用读取就好像使用OPENROWSET(例如INSERT INTO ... SELECT ... FROM OPENROWSET(BULK ...) AS bulk)插入临时表一样,但是测试导致与BULK INSERT相同的错误!