当前位置: 首页 > 知识库问答 >
问题:

如何允许非管理员用户在Azure SQL数据库上使用大容量插入

周鸿云
2023-03-14

我目前正在努力让BULK INSERT在不使用管理员用户的情况下在AzureSQL数据库上工作。以下脚本运行良好,完全符合预期,并在管理员用户执行时记录在案:

-- 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;

当以非管理员用户身份执行此操作时(已被授予选择、更新、删除、插入、更改、控制和管理数据库批量操作的权限),我会收到以下错误消息:

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

根据文档,拥有插入、更改和(最重要的)管理数据库批量操作的权限就足够了。但是,当检查数据库权限时(在sys.database\u permissions中),我可以看到向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!根据文档,这应该是DABO管理数据库批量操作

所以我现在的问题是:这是Azure SQL数据库中的一个bug吗?有什么事我忘了做吗?非管理员用户实际上不支持大容量插入吗?

一些注意事项:

  • @@VERSION是MicrosoftSQLAzure(RTM)- 12.0.2000.8Jan26 2018 23:35:00和SERVERPROPERTY('Engineering Edition')是5。
  • 我在类似问题上找到的所有资源都谈到SQL服务器,在那里你要么需要有角色bulkadmin,要么需要授予ADMINISTER BULK OPERATION(注意,那里缺少数据库!)对用户。但是AzureSQL数据库两者都没有。

共有1个答案

廖弘量
2023-03-14

以下是Microsoft github帐户的一个示例,其中包含一条非常重要的信息:

创建一个永久表。临时表当前不支持大容量插入,尽管它将与OPENROWSET一起使用

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

注意:示例中的引用读起来似乎可以使用OPENROWSET插入到临时表中(例如,INSERT into…SELECT…from OPENROWSET(BULK…)作为批量),但测试会导致与批量插入相同的错误!

 类似资料:
  • 我正在尝试建立一个只有我可以编写的Firebase数据库。所以没有用户有权编写任何东西。但每个人都可以阅读它。 然而,我无法为它制定规则。我使用电子邮件/密码登录创建了一个管理员用户,我知道它的UID。假设我的UID是: 我尝试了这两种方法,但它们不允许我写入数据库。 . 那么,如何只允许一个具有特定UID的用户向数据库写入任何内容呢?

  • 问题内容: 我正在写以下命令 我怎样才能将此命令限制为仅管理员?我试着看,它说。我如何检查给定的用户是否是? 问题答案: 有两种方法:通过使用的角色白名单 或经许可使用 这两个装饰器都是Checks,如果它们失败,将引发您的一些子类供您选择处理。

  • 我是wordpress的新手,在管理数据库方面有困难。我已经安装了“管理员”插件来管理数据库。我已经创建了一个名为“usersupp_admin”的新表。现在我还创建了一个自定义模板,该模板将使用PDO语句连接到此数据库,现在的问题是在哪里可以获取主机、数据库名、用户和密码?以下是代码: 任何帮助都将不胜感激。

  • 我已经为PostgreSQL创建了新的Azure数据库-灵活的服务器,管理员用户为“admin\u demo”。 现在,在创建数据库之后,我完成了以下步骤: > 创建角色role\u developer;--创建新角色。 授予使用权限,在模式abc上创建以role_developer;--授予对模式中新角色的访问权限。 将架构abc中所有表的select、insert、update、delete授

  • 我需要你对LDAP结构和相关ACL的建议。 我们的LDAP将管理10个(数量可能不同)组织,其中包含用户(总共250个用户),我希望每个组织允许1个用户管理他自己组织的所有用户。用户也将附加到自定义组。 我已经读过: http://www.openldap.org/doc/admin24/access-control.html http://www.openldap.org/faq/data/ca

  • 上下文:我正在使用Firebase作为后端组装一个时间跟踪应用程序。我当前的节点结构在根节点上有时间条目和客户端,如下所示: > 时间输入 条目ID 用户ID 客户ID、时间、日期、描述等 客户 客户ID 名称、项目等 如果我只是根据用户添加和提取时间条目,那么这种结构可以很好地工作,但我想开始根据每个客户机组合报告。目前,这意味着为每个用户发出单独的HTTP请求,然后通过clientID进行过滤