【问题标题】:How do you create an Event Grid Subscription for successful SQL DacPac imports?如何为成功的 SQL DacPac 导入创建事件网格订阅?
【发布时间】:2019-06-10 19:30:40
【问题描述】:

我无法为“从 DacPac 创建新数据库”操作创建事件网格订阅。

我已尝试为包含我的 SQL Server 的资源组创建事件网格订阅。我已经为资源组启用了所有事件发送,并注册了一个 webhook 来发送资源组上的事件。我已经测试了事件网格订阅,它正在为 ResourceWriteSuccess、ResourceDeleteSuccess 等发送 webhook。所以我知道我的应用程序和 Azure 之间的实现运行正常。

这是我尝试为其创建事件网格订阅的事件的有效负载。

{
    "authorization": {
        "action": "Microsoft.Sql/servers/import/action",
        "scope": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Sql/servers/my-sql-server"
    },
    "caller": "00000000-0000-0000-0000-000000000000",
    "channels": "Operation",
    "claims": {
        "aud": "https://management.azure.com/",
        "iss": "https://sts.windows.net/00000000-0000-0000-0000-000000000000/",
        "iat": "1560193452",
        "nbf": "1560193452",
        "exp": "1560197352",
        "aio": "82WgYJi2DHbwKEodlmt4/lNKdx2cDQA=",
        "appid": "00000000-0000-0000-0000-000000000000",
        "appidacr": "1",
        "http://schemas.microsoft.com/identity/claims/identityprovider": "https://sts.windows.net/00000000-0000-0000-0000-000000000000/",
        "http://schemas.microsoft.com/identity/claims/objectidentifier": "00000000-0000-0000-0000-000000000000",
        "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "00000000-0000-0000-0000-000000000000",
        "http://schemas.microsoft.com/identity/claims/tenantid": "00000000-0000-0000-0000-000000000000",
        "uti": "OzdZ2AA_HkCWRjLQ0E9hAQ",
        "ver": "1.0"
    },
    "correlationId": "00000000-0000-0000-0000-000000000000",
    "description": "",
    "eventDataId": "00000000-0000-0000-0000-000000000000",
    "eventName": {
        "value": "EndRequest",
        "localizedValue": "End request"
    },
    "category": {
        "value": "Administrative",
        "localizedValue": "Administrative"
    },
    "eventTimestamp": "2019-06-10T19:09:14.4117972Z",
    "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Sql/servers/my-sql-server/events/00000000-0000-0000-0000-000000000000/ticks/636957905544117972",
    "level": "Informational",
    "operationId": "5b1a45c6-297c-4c1e-81c5-31a10375a9e0",
    "operationName": {
        "value": "Microsoft.Sql/servers/import/action",
        "localizedValue": "Create new database from DacPac"
    },
    "resourceGroupName": "my-resource-group",
    "resourceProviderName": {
        "value": "Microsoft.Sql",
        "localizedValue": "Microsoft SQL"
    },
    "resourceType": {
        "value": "Microsoft.Sql/servers",
        "localizedValue": "Microsoft.Sql/servers"
    },
    "resourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Sql/servers/my-sql-server",
    "status": {
        "value": "Accepted",
        "localizedValue": "Accepted"
    },
    "subStatus": {
        "value": "Accepted",
        "localizedValue": "Accepted (HTTP Status Code: 202)"
    },
    "submissionTimestamp": "2019-06-10T19:10:57.1665135Z",
    "subscriptionId": "00000000-0000-0000-0000-000000000000",
    "properties": {
        "statusCode": "Accepted",
        "serviceRequestId": "00000000-0000-0000-0000-000000000000"
    },
    "relatedEvents": []
}

我希望为启用所有事件的资源组创建事件网格订阅会为上面显示的事件发送 webhook;但是,我没有收到任何表明此操作已成功执行的 webhook。

【问题讨论】:

  • 用于测试目的。使用门户 UI 将您的测试数据库导出/导入存储容器。您应该在订阅者中看到多个事件类型,例如:Microsoft.Resources.ResourceActionSuccess 和 Microsoft.Resources.ResourceWriteSuccess。
  • 是的,我在通过门户导入时确实收到了这些事件;但是,当我通过 Azure API 进行导入时,我没有收到这些事件。在我的应用程序中,我们通过允许现有客户上传数据库备份来自动化他们的入职,我需要一个事件来了解导入何时完成。
  • 如何从应用程序中导入数据库,是否使用 REST API 调用?
  • 是的,我进行了 API 调用,效果很好。导入工作,并创建了我的数据库。以这种方式调用时,Azure 根本不会触发资源操作的事件。
  • 没错,我已经测试了导出、创建数据库(空)、删除数据库和我的 AEG 订阅者接收所有事件。但是对于 Import,没有事件。根据文档docs.microsoft.com/en-us/rest/api/sql/…,导入操作必须在现有的空数据库中完成,因此我在导入之前创建了一个空数据库(可能与 azure 门户使用相同的方式),然后我收到了所有事件.

标签: azure azure-sql-database azure-eventgrid


【解决方案1】:

根据我们的讨论和测试:

  1. 导入数据库使用 Azure 门户上的一项功能运行良好,门户活动日志显示了导入后台异步过程的所有步骤以及AEG 事件已发布。

  2. 导入数据库使用 REST POST Databases - Import Export - Import活动日志中有不同的行为,并且没有发布任何 AEG 事件。 以下示例显示了此问题:

    POST: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Default-SQL-NorthCentralUS/providers/Microsoft.Sql/servers/h000000000/import?api-version=2014-04-01
    {
      "databaseName": "TestDbImport",
      "edition": "Basic",
      "serviceObjectiveName": "Basic",
      "maxSizeBytes": "2147483648",
      "storageKeyType": "StorageAccessKey",
      "storageKey": "....",
      "storageUri": "https://xxxxxxx.blob.core.windows.net/database/testbacpac.bacpac",
      "administratorLogin": "myadmin",
      "administratorLoginPassword": "********",
      "authenticationType": "SQL"
    }
    

    POST 被接受并且门户活动日志正在推送以下内容:

上述日志消息将永远保留,它表明导入操作已被接受,但没有来自此导入后台进程的更多活动日志。没有日志消息该过程已完成等。此外,此导入过程没有发布单个 AEG 事件。另一方面,数据库已经创建、更新等,但我们没有任何关于完成的迹象。请注意,活动日志状态应在 FailedSucceeded 状态下完成。

我可以看到这里,有一个问题。如果没有活动日志消息,我们不能期望来自该资源组的 AEG 事件。看起来,Activity 日志消息的导入操作过程中可能存在检测错误。

请注意,导出、创建数据库、删除等其他 REST API 运行良好,包括所有活动日志和 AEG 事件。

因此,以下是针对此潜在错误的解决方法。它基于在使用导入操作之前创建一个空数据库。

以下是示例:

创建空数据库:

    PUT: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Default-SQL-NorthCentralUS/providers/Microsoft.Sql/servers/h000000000/databases/TestDbImport?api-version=2017-10-01-preview
    {
      "location": "NorthCentralUS"
    }

发送一个关于成功写入数据库的AEG事件后,

 "eventType": "Microsoft.Resources.ResourceWriteSuccess",
 "resourceUri": "/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/Default-SQL-NorthCentralUS/providers/Microsoft.Sql/servers/h000000000/databases/TestDbImport",
 "operationName": "Microsoft.Sql/servers/databases/write",
 "status": "Succeeded",

Import 操作可以 POST(参见上面的 url 和有效负载)。

我的门户中的以下活动日志显示了对空数据库执行导入操作的所有活动:

我确实建议向 Azure SQL 团队提供反馈,以解决导入操作的问题。

【讨论】:

  • 感谢您确认这是一个问题,Roman。目前,解决方法对我不起作用。它不起作用的原因是我的应用程序响应正在创建的数据库的 webhook,并针对数据库运行脚本以为我们的客户准备它。创建数据库然后执行导入将导致我的应用程序运行这些脚本两次,从而导致它们失败。为了保持干净和干燥的代码,我需要完成和创建数据库的导入操作的特定事件。我会让 Azure 团队知道这个问题。再次感谢!
  • Auzre SQL 团队目前正在与 Azure 事件网格团队合作,为面临此问题的其他人解决此问题。我会在有更新时发布。
  • 谢谢,我已经在 GitHub 上创建了这个问题,github.com/MicrosoftDocs/azure-docs/issues/…
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 2016-01-22
  • 2018-03-18
  • 2021-12-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多