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

标签 azure permissions azure-sql-database bulkinsert

我目前正在努力在不使用管理员用户的情况下在 Azure SQL 数据库上进行BULK INSERT工作。。以下脚本运行良好且完全符合预期,并且 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!根据documentation ,这应该是 DABOADMINISTER DATABASE BULK OPERATIONS

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

一些注意事项:

  • @@VERSION 是“M​​icrosoft 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 数据库两者都没有。

最佳答案

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

Create a permanent table. A temp table currently is not supported for BULK INSERT, although it will will work with OPENROWSET

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

注意:示例中的引用读起来就好像可以使用 OPENROWSET 插入临时表(例如 INSERT INTO ... SELECT ... FROM OPENROWSET(BULK ...) ASbulk),但测试会导致与 BULK INSERT 相同的错误!

关于azure - 如何允许非管理员用户在 Azure SQL 数据库上使用 BULK INSERT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381637/

相关文章:

sql - 根据不同列值返回行数据

java - AADSTS50011 回复地址未使用安全方案[AZURE]

Azure 事件网格高级筛选为 Not Null 运算符

swift - 在 OS X swift 3.0 中设置删除文件的权限

SQL Azure : Executing SQL directly; no cursor

azure - Azure 中什么算作计费数据传输?

azure - 最简单的 Azure 存储操作

azure - 使用 Azure API 管理模拟故障转移

php - 从 PHP 运行 Linux 命令

mysql - procedure/outfile/prepared 语句的权限