我目前正在努力让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}},这应该是DABO
和ADMINISTER 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“。bulkadmin
或者需要向用户授予ADMINISTER BULK OPERATIONS(请注意DATABASE缺失!)。但Azure SQL数据库既没有。答案 0 :(得分:1)
这是example on the Microsoft github account,其中包含非常重要的信息:
创建永久表。目前不支持临时表 BULK INSERT,虽然它可以与OPENROWSET一起使用
因此,可以通过从表名中删除#
来解决问题,使其成为永久表。然后,即使对于非管理员用户,一切都按预期工作并记录下来。
注意:示例中的引用读取就好像使用OPENROWSET(例如INSERT INTO ... SELECT ... FROM OPENROWSET(BULK ...) AS bulk
)插入临时表一样,但是测试导致与BULK INSERT相同的错误!