如何为成功的 SQL DacPac 导入创建事件网格订阅?

How do you create an Event Grid Subscription for successful SQL DacPac imports?

我无法为操作创建事件网格订阅 "Create new database from DacPac"。

我已尝试为包含我的 SQL 服务器的资源组创建事件网格订阅。我已启用所有事件以发送资源组并注册了一个 webhook 以发送资源组上的事件。我已经测试了事件网格订阅,它正在为 ResourceWriteSuccess、ResourceDeleteSuccess 等发送 webhooks。所以我知道我的应用程序和 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。

根据我们的讨论和测试:

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

  2. 导入数据库 使用 REST POST Databases - Import Export - Import[=70= 中有不同的行为] Log 并且没有发布任何 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 已被接受,门户 Active Log 推送以下内容:

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

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

请注意,导出、创建数据库、删除等其他 REST API 运行良好,包括所有 Activity 日志和 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",

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

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

我确实建议向 Azure SQL 团队反馈导入操作的这个问题。