JSON-berichtindeling - gebeurtenisstreaming wijzigen

Van toepassing op: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Dit artikel beschrijft het CloudEvents-berichtformaat dat streamt naar Azure Event Hubs of Fabric Eventstream wanneer je de change event streaming (CES)-functie gebruikt in SQL Server 2025 (17.x), Azure SQL Database, Azure SQL Managed Instance, en SQL-database in Microsoft Fabric.

Opmerking

Het streamen van Change Event is momenteel in preview en heeft verschillen in ondersteuning tussen producten. Tijdens de preview kan deze functie worden gewijzigd.

Overzicht

Change event streaming genereert events die de CloudEvents-specificatie volgen, zodat je ze eenvoudig kunt integreren met event-driven systemen. Alle CES CloudEvents bevatten 11 kenmerken (velden). Je kunt CES configureren om de hele CloudEvent, inclusief het data attribuut, te serialiseren als native JSON- of Avro-binary. Native JSON-events bevatten geen Avro-binaire secties. In beide serialisatieformaten heeft het data attribuut een byte-array-type. De bytes gebruiken JSON- of Avro-binaire codering volgens het geselecteerde serialisatieformaat en volgen het CES-dataattribuut Avro-schema.

Important

Vanaf 15 augustus 2026 is het AMQP-protocol verouderd voor change event streaming (CES). Er zijn verschillen tussen platforms. Voor migratiestappen en tijdlijnen, zie AMQP-protocol deprecation.

Waar van toepassing, komen de beschrijvingen in deze sectie uit de CloudEvent-specificatie, die meer details bevat.

Kenmerken

  • specversion:

    • Gegevenstype: Tekenreeks
    • Vereist CloudEvent-kenmerk
    • De versie van de CloudEvents-specificatie die door de gebeurtenis wordt gebruikt. Deze versie maakt de interpretatie van de context mogelijk.
  • type

    • Gegevenstype: Tekenreeks
    • Vereist CloudEvent-kenmerk
    • Bevat een waarde die het type gebeurtenis beschrijft dat is gerelateerd aan het oorspronkelijke exemplaar. Het formaat van deze waarde wordt door de producent bepaald en kan informatie bevatten zoals de versie van het type. Voor meer informatie, zie Versiebeheer van CloudEvents.
    • Voor event streaming events wijzigen is het type momenteel: com.microsoft.SQL.CES.DML.V{n}, waarbij {n} de versie van het DML-event event schema van Microsoft change event streaming aangeeft.
      • De huidige nieuwste schemaversie is 1.
  • source

    • Gegevenstype: Tekenreeks
    • Vereist CloudEvent-kenmerk
    • Identificeert de context waarin een gebeurtenis is opgetreden. De combinatie van bron en ID moet uniek zijn voor elk evenement. Momenteel wordt dit veld altijd verzonden als \/ gebeurtenissen die vanuit SQL worden gestreamd.
  • id

    • Gegevenstype: Tekenreeks
    • Vereist CloudEvent-kenmerk
    • Identificeert de gebeurtenis. Producenten moeten ervoor zorgen dat de combinatie van bron en ID uniek is voor elk afzonderlijk evenement. Als een dubbele gebeurtenis opnieuw wordt verzonden (bijvoorbeeld vanwege een netwerkfout), kan deze dezelfde id hebben. Consumenten kunnen ervan uitgaan dat gebeurtenissen met identieke bron en id dubbele waarden zijn.
  • logicalid

    • Gegevenstype: Tekenreeks
    • Extensiekenmerk
    • Gedeelde logische ID's identificeren gesplitste berichten (vanwege de beperkingen in de berichtgrootte van Event Hubs).
  • time

    • Gegevenstype: Tijdstempel
    • Optioneel CloudEvent-kenmerk
    • UTC-tijdstempel van wanneer de commit plaatsvond binnen een SQL-transactie die oorspronkelijk een gestreamde gebeurtenis activeert.
  • datacontenttype

    • Gegevenstype: Tekenreeks
    • Optioneel CloudEvent-kenmerk
    • Inhoudstype van gegevenswaarde. Met dit kenmerk kunnen gegevens elk type inhoud bevatten, waarbij de indeling en codering kunnen verschillen van die van de gekozen gebeurtenisindeling. Een gebeurtenis die wordt weergegeven met de JSON-envelopindeling kan bijvoorbeeld een XML-nettolading in de gegevens bevatten en de consument wordt geïnformeerd door dit kenmerk dat wordt ingesteld op 'application/xml'. De regels voor hoe data-inhoud wordt weergegeven voor verschillende datacontenttype waarden zijn gedefinieerd in de event-formaat specificaties.
  • operation

    • Gegevenstype: Tekenreeks
    • Extensiekenmerk
    • Geeft het type SQL-operatie weer dat plaatsvond:
      • INS voor inserts
      • UPD voor updates
      • DEL voor verwijderingen
  • segmentindex

    • Gegevenstype: Geheel getal
    • Extensiekenmerk
    • Segmentindex, die de positie van het bericht binnen de logische berichtblokken aangeeft. De segmentindex bevat informatie over de positie van het bericht in de volgorde van logische berichtfragmenten. Dit veld is altijd aanwezig. Gebruik logicalid, segmentindex, en velden finalsegment om binnenkomende gebeurtenissen te sorteren die een grote SQL-payload vertegenwoordigen, verdeeld volgens de geconfigureerde max_message_size_kb waarde.
  • finalsegment

    • Gegevenstype: Booleaanse waarde
    • Extensiekenmerk
    • Geeft aan of dit segment het laatste segment van de reeks is. Dit veld is altijd aanwezig en helpt te bepalen of een SQL-gebeurtenis is opgesplitst in subgebeurtenissen volgens de geconfigureerde max_message_size_kb waarde.
  • data

    • Datatype: Byte-array
    • Optioneel CloudEvent-kenmerk
    • Bevat de domeinspecifieke gebeurtenisgegevens die de wijziging beschrijven. Deserialiseer de bytes als JSON- of Avro-binair volgens het geselecteerde serialisatieformaat. De gedeserialiseerde data volgt het CES-dataattribuut Avro-schema. Voor informatie over de velden, zie Dataattribuutformaat.

Opmerking

Berichtsplitsing staat los van kolomwaarde-afkapping. Voordat CES het data attribuut serialiseert, korten ze elke gestreamde kolomwaarde groter dan 1 MB af tot 1 MB. CES splitst vervolgens het gevormde event op in berichtblokken indien nodig volgens max_message_size_kb.

Voorbeelden

Voorbeeld van JSON-bericht - invoegen

{
  "specversion": "1.0",
  "type": "com.microsoft.SQL.CES.DML.V1",
  "source": "\/",
  "id": "56cb8ff3-5c55-4f3b-a7f7-b044d1933ef6",
  "logicalid": "1bf2756a-c15f-4d2e-a2d5-7d3f9dbf85b0:000000B1000008A80007:00000000000000000001",
  "time": "2026-08-07T16:25:00.890Z",
  "datacontenttype": "application\/json",
  "operation": "INS",
  "segmentindex": 0,
  "finalsegment": true,
  "data": "{\"eventsource\":{\"db\":\"EmployeesDb\",\"schema\":\"dbo\",\"tbl\":\"Employees\",\"cols\":[{\"name\":\"Id\",\"type\":\"int\",\"index\":0},{\"name\":\"FirstName\",\"type\":\"nvarchar(50)\",\"index\":1},{\"name\":\"LastName\",\"type\":\"nvarchar(50)\",\"index\":2},{\"name\":\"SignupDate\",\"type\":\"datetime2(7)\",\"index\":3}],\"pkkey\":[{\"columnname\":\"Id\",\"value\":\"8\"}],\"transaction\":{\"commitlsn\":\"000000B1:000008A8:0007\",\"beginlsn\":\"000000B1:000008A8:0003\",\"sequencenumber\":1,\"finalevent\":false,\"committime\":\"2026-08-07T16:25:00.890Z\"}},\"eventrow\":{\"old\":\"{}\",\"current\":\"{\\\"Id\\\":\\\"8\\\",\\\"FirstName\\\":\\\"Nikola\\\",\\\"LastName\\\":\\\"Nikolic\\\",\\\"SignupDate\\\":\\\"2026-08-07 16:25:00.8833333\\\"}\"}}"
}

JSON-berichtvoorbeeld - update

{
  "specversion": "1.0",
  "type": "com.microsoft.SQL.CES.DML.V1",
  "source": "\/",
  "id": "19221db1-a1b5-4ec7-8937-3fdf9d762abb",
  "logicalid": "1bf2756a-c15f-4d2e-a2d5-7d3f9dbf85b0:000000B1000009300009:00000000000000000001",
  "time": "2026-08-07T16:30:10.123Z",
  "datacontenttype": "application\/json",
  "operation": "UPD",
  "segmentindex": 0,
  "finalsegment": true,
  "data": "{\"eventsource\":{\"db\":\"EmployeesDb\",\"schema\":\"dbo\",\"tbl\":\"Employees\",\"cols\":[{\"name\":\"Id\",\"type\":\"int\",\"index\":0},{\"name\":\"FirstName\",\"type\":\"nvarchar(50)\",\"index\":1},{\"name\":\"LastName\",\"type\":\"nvarchar(50)\",\"index\":2},{\"name\":\"SignupDate\",\"type\":\"datetime2(7)\",\"index\":3}],\"pkkey\":[{\"columnname\":\"Id\",\"value\":\"8\"}],\"transaction\":{\"commitlsn\":\"000000B1:00000930:0009\",\"beginlsn\":\"000000B1:00000930:0002\",\"sequencenumber\":1,\"finalevent\":false,\"committime\":\"2026-08-07T16:30:10.123Z\"}},\"eventrow\":{\"old\":\"{\\\"Id\\\":\\\"8\\\",\\\"FirstName\\\":\\\"Nikola\\\",\\\"LastName\\\":\\\"Nikolic\\\",\\\"SignupDate\\\":\\\"2026-08-07 16:25:00.8833333\\\"}\",\"current\":\"{\\\"Id\\\":\\\"8\\\",\\\"FirstName\\\":\\\"Nikola\\\",\\\"LastName\\\":\\\"Nikolic-Smith\\\",\\\"SignupDate\\\":\\\"2026-08-07 16:25:00.8833333\\\"}\"}}"
}

Voorbeeld van JSON-bericht - verwijderen

{
  "specversion": "1.0",
  "type": "com.microsoft.SQL.CES.DML.V1",
  "source": "\/",
  "id": "520f9a65-43d7-47f2-94f5-7ea14df635ed",
  "logicalid": "1bf2756a-c15f-4d2e-a2d5-7d3f9dbf85b0:000000B1000009700008:00000000000000000001",
  "time": "2026-08-07T16:35:42.450Z",
  "datacontenttype": "application\/json",
  "operation": "DEL",
  "segmentindex": 0,
  "finalsegment": true,
  "data": "{\"eventsource\":{\"db\":\"EmployeesDb\",\"schema\":\"dbo\",\"tbl\":\"Employees\",\"cols\":[{\"name\":\"Id\",\"type\":\"int\",\"index\":0},{\"name\":\"FirstName\",\"type\":\"nvarchar(50)\",\"index\":1},{\"name\":\"LastName\",\"type\":\"nvarchar(50)\",\"index\":2},{\"name\":\"SignupDate\",\"type\":\"datetime2(7)\",\"index\":3}],\"pkkey\":[{\"columnname\":\"Id\",\"value\":\"8\"}],\"transaction\":{\"commitlsn\":\"000000B1:00000970:0008\",\"beginlsn\":\"000000B1:00000970:0003\",\"sequencenumber\":1,\"finalevent\":false,\"committime\":\"2026-08-07T16:35:42.450Z\"}},\"eventrow\":{\"old\":\"{\\\"Id\\\":\\\"8\\\",\\\"FirstName\\\":\\\"Nikola\\\",\\\"LastName\\\":\\\"Nikolic-Smith\\\",\\\"SignupDate\\\":\\\"2026-08-07 16:25:00.8833333\\\"}\",\"current\":\"{}\"}}"
}

Gegevenskenmerkindeling

Het data attribuut is een byte-array. Deserialiseer de bytes als JSON- of Avro-binair volgens het geselecteerde serialisatieformaat. In beide formaten volgt het resulterende Data record het CES-dataattribuut Avro-schema en bevat het twee attributen:

  • eventsource
  • eventrow
{
  "data": "{\"eventsource\": {}, \"eventrow\": {\"old\": \"{}\", \"current\": \"{}\"}}"
}

De volgende secties leggen de gedeserialiseerde attributen in meer detail uit.

eventsource

Beschrijft de metagegevens over de database en de tabel waarin de gebeurtenis heeft plaatsgevonden:

  • db

    • Gegevenstype: Tekenreeks
    • Beschrijving: De naam van de database waar de tabel zich bevindt.
    • Voorbeeld: EmployeesDb
  • schema

    • Gegevenstype: Tekenreeks
    • Beschrijving: Het databaseschema dat de tabel bevat.
    • Voorbeeld: dbo
  • tbl

    • Gegevenstype: Tekenreeks
    • Beschrijving: De tabel waarin de gebeurtenis heeft plaatsgevonden.
    • Voorbeeld: Employees
  • cols

    • Gegevenstype: Matrix
    • Beschrijving: Een matrix met een detail van de kolommen in de tabel.
      • name (snaar): De naam van de kolom.
      • type (string): Het SQL-datatype van de kolom, inclusief lengte, precisie of schaal indien van toepassing. Voorbeelden zijn , intnvarchar(50)en datetime2(7).
      • index (geheel getal): De index of positie van de kolom in de tabel.
  • pkkey

    • Gegevenstype: Matrix
    • Beschrijving: Vertegenwoordigt de primaire-sleutelkolommen en de bijbehorende waarden voor het identificeren van de specifieke rij.
      • columnname (string): De naam van de kolom die in de primaire sleutel wordt gebruikt.
      • value (string): De waarde voor de kolom die in de primaire sleutel wordt gebruikt. Deze waarde helpt om de rij uniek te identificeren.
  • transaction

    • Datatype: Object
    • Beschrijving: Beschrijft de SQL-transactie die de data-operatie bevat.
      • commitlsn (string): Het commitlog-sequentienummer (LSN) van de transactie.
      • beginlsn (string): Het begin van de LSN van de transactie.
      • sequencenumber (geheel getal): Het opeenvolgende aantal van de databewerking binnen de transactie. Gebruik deze waarde om gebeurtenissen binnen een transactie te sorteren.
      • finalevent (booleaan): Niet in gebruik. Dit veld heeft altijd een waarde van false.
      • committime (string): De datum en tijd waarop de transactie in de database werd gecommandeerd.

Opmerking

Bij SQL-producten die zijn geconfigureerd met een niet-UTC-tijdzone, bevat het committime veld onterecht een Z-achtervoegsel, hoewel dit veld de lokale tijd van de publicatiedatabase toont. Wanneer de database UTC gebruikt, komen de waarde en het achtervoegsel overeen. Dit probleem is bekend en er is een oplossing in behandeling in een toekomstige release van de functie.

eventrow

Beschrijft wijzigingen op rijniveau en vergelijkt de oude en huidige waarden van de velden in de record.

  • oud (object verpakt in tekenreeks): Vertegenwoordigt de waarden in de rij vóór de gebeurtenis.
    • Elk sleutel-waardepaar bestaat uit:
      • <column_name>: (tekenreeks): De naam van de kolom.
      • <column_value>: (tekenreeks/int/etc.): de vorige waarde voor die kolom.
  • current (object verpakt in tekenreeks): Vertegenwoordigt de bijgewerkte waarden in de rij na de gebeurtenis.
    • Net als bij het oude object, waarbij elk sleutel-waardepaar is gestructureerd als:
      • <column_name> (tekenreeks): De naam van de kolom.
      • <column_value> (tekenreeks/int/etc.): de nieuwe of huidige waarde voor die kolom.

CES CloudEvent Avro-schema

{
  "type": "record",
  "name": "ChangeEvent",
  "fields": [
    {
      "name": "specversion",
      "type": "string"
    },
    {
      "name": "type",
      "type": "string"
    },
    {
      "name": "source",
      "type": "string"
    },
    {
      "name": "id",
      "type": "string"
    },
    {
      "name": "logicalid",
      "type": "string"
    },
    {
      "name": "time",
      "type": "string"
    },
    {
      "name": "datacontenttype",
      "type": "string"
    },
    {
      "name": "operation",
      "type": "string"
    },
    {
      "name": "segmentindex",
      "type": "int"
    },
    {
      "name": "finalsegment",
      "type": "boolean"
    },
    {
      "name": "data",
      "type": "bytes"
    }
  ]
}

CES dataattribuut Avro schema

Gebruik het volgende schema bij het deserialiseren van de data bytearray in native JSON en Avro binaire CloudEvents:

{
  "name": "Data",
  "type": "record",
  "fields": [
    {
      "name": "eventsource",
      "type": {
        "name": "EventSource",
        "type": "record",
        "fields": [
          {
            "name": "db",
            "type": "string"
          },
          {
            "name": "schema",
            "type": "string"
          },
          {
            "name": "tbl",
            "type": "string"
          },
          {
            "name": "cols",
            "type": {
              "type": "array",
              "items": {
                "name": "Column",
                "type": "record",
                "fields": [
                  {
                    "name": "name",
                    "type": "string"
                  },
                  {
                    "name": "type",
                    "type": "string"
                  },
                  {
                    "name": "index",
                    "type": "int"
                  }
                ]
              }
            }
          },
          {
            "name": "pkkey",
            "type": {
              "type": "array",
              "items": {
                "name": "PkKey",
                "type": "record",
                "fields": [
                  {
                    "name": "columnname",
                    "type": "string"
                  },
                  {
                    "name": "value",
                    "type": "string"
                  }
                ]
              }
            }
          },
          {
            "name": "transaction",
            "type": {
              "name": "Transaction",
              "type": "record",
              "fields": [
                {
                  "name": "commitlsn",
                  "type": "string"
                },
                {
                  "name": "beginlsn",
                  "type": "string"
                },
                {
                  "name": "sequencenumber",
                  "type": "int"
                },
                {
                  "name": "finalevent",
                  "type": "boolean"
                },
                {
                  "name": "committime",
                  "type": "string"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "name": "eventrow",
      "type": {
        "name": "EventRow",
        "type": "record",
        "fields": [
          {
            "name": "old",
            "type": "string"
          },
          {
            "name": "current",
            "type": "string"
          }
        ]
      }
    }
  ]
}