【问题标题】:External table of an external table外部表的外部表
【发布时间】:2021-09-02 13:18:30
【问题描述】:

我正在尝试如下解决方案:

  1. 数据湖有原始数据文件
  2. 无服务器池 Synapse DB 具有指向湖的外部表 - 工作正常。
  3. Azure PaaS SQL DB 具有引用 Synapse 池外部表的外部表。

我收到如下错误消息:

登录失败 ondemandserver.database。 请验证分片是否可访问并且凭证 与外部数据源 XXXX 相关的信息是 正确

我正在尝试为 PaaS 数据库上的凭据使用服务帐户。如果我们将服务帐户想象为“user@abc.com”并且与突触工作区位于同一域中,则凭据设置如下

CREATE DATABASE SCOPED CREDENTIAL [synapse]
WITH
  IDENTITY = 'user' , -- intentionally no domain name as per microsft docs, adding domain generates a cannot open server error
  SECRET = 'pwd'

我已通过存储资源管理器检查 user@abc.com 有权访问。我已使用 SSMS 成功使用服务帐户凭据登录到无服务器池。我使用 Synapse Studio 中生成的脚本在无服务器池上设置了外部表。

我认为这里的凭据传递存在某种问题,或者嵌套外部表存在限制。

使用无服务器池的 sql 管理员凭据会生成“无法找到文件”错误,这很有意义,因为我可能正在尝试使用 sql 身份验证方法访问数据湖。

如果我能克服从 PaaS DB 到 Synapse 的登录障碍,我认为这会解决。

【问题讨论】:

    标签: azure-sql-database azure-synapse


    【解决方案1】:

    查看firewall configurations,例如,当您在 Azure SQL 数据库或 Azure Synapse Analytics 中创建名为 mysqlserver 的新服务器时,服务器级防火墙会阻止对服务器公共终结点的所有访问(可通过 mysqlserver 访问) .database.windows.net)。

    Azure Synapse 仅支持服务器级 IP 防火墙规则。不支持数据库级IP防火墙规则

    How the firewall works默认情况下,在从 Azure 门户创建新的逻辑 SQL 服务器期间,允许 Azure 服务和资源访问此服务器设置设置为否。Connections from inside Azure

    以下错误似乎是相关的:

    Error 26:错误定位服务器指定:System.Data.SqlClient.SqlException:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:SQL 网络接口,错误:26 - 错误定位服务器/指定实例)

    Error 40: 无法打开与服务器的连接:建立与 SQL Server 的连接时出现与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

    此外,在 SQL DB 的 Premium 服务层作为查询端点支持弹性数据库查询,而查询中涉及的数据库集合可以是任何层。 (此高级限制在预览的早期阶段是暂时的。)

    To confirm whether an error is caused by a connectivity issue,查看堆栈跟踪以查找显示调用以打开连接的帧,如下所示(注意对 SqlConnection 类的引用)

    对于Database-scoped master key and credentials,它会创建一个数据库凭据。数据库凭据未映射到服务器登录名或数据库用户。每当数据库执行需要访问的操作时,数据库都会使用该凭据访问外部位置。

    Synatx:

    CREATE DATABASE SCOPED CREDENTIAL credential_name
    WITH IDENTITY = 'identity_name'
        [ , SECRET = 'secret' ]
    

    credential_name 指定正在创建的数据库范围凭据的名称。 credential_name 不能以数字 (#) 符号开头。系统凭据以 ## 开头。

    IDENTITY ='identity_name' 指定在服务器外部连接时要使用的帐户名称。若要使用共享密钥从 Azure Blob 存储导入文件,标识名称必须是 SHARED ACCESS SIGNATURE。要将数据加载到 Azure Synapse Analytics 中,任何有效值都可用于标识。

    使用 Kerberos(Windows Active Directory 或 MIT KDC)时,请勿在 IDENTITY 参数中使用域名。它应该只是帐户名称。

    SQL 数据库为其全局查询功能使用数据库范围的凭据

    【讨论】:

    • 感谢您的想法,我已经在 Microsoft Q&A 上讨论过这个问题,普遍的共识是弹性查询不支持 AD - 因此出现错误。因此,您必须使用 sql auth 并且它看起来像 through 正在传递到嵌套的外部数据源并导致尝试连接到 Lake 的 auth 错误(因为它使用的是弹性查询中的 sql auth 而不是嵌套外部数据源上的 AD 身份验证) - 正在等待确认。
    • 哦,太好了,让我们随时了解 ✌
    • 会的,在这种情况下,我将不得不部署到无服务器池而不是 PaaS 以进行生产,这是一些重构工作:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多