JSON-üzenetformátum – eseménystreamelés módosítása

A következőkre vonatkozik: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL Database a Microsoft Fabricben

Ez a cikk leírja a CloudEvents üzenetformátumot, amely az Azure Event Hubs-ba vagy a Fabric Eventstream-be áramlik, amikor az SQL Server 2025 (17.x), Azure SQL Database, Azure SQL Managed Instance verziókban a Change Event Streaming (CES) funkciót használjuk, és SQL adatbázis a Microsoft Fabric-ben.

Megjegyzés:

A Change event streaming jelenleg előnézetben van, és a termékek támogatásában eltérések vannak. Az előzetes verzióban ez a funkció változhat.

Áttekintés

A Change event streaming olyan eseményeket bocsát ki, amelyek követik a CloudEvents specifikációt, így könnyen integrálható őket eseményvezérelt rendszerekkel. Minden CES CloudEvents 11 attribútumot (mezőket) tartalmaz. Konfigurálhatod a CES-t, hogy az egész CloudEventet, beleértve az attribútumot data is, serializálja natív JSON vagy Avro bináris formátumban. A natív JSON események nem tartalmaznak Avro bináris szakaszokat. Mindkét serializációs formátumban az data attribútumnak bájt-tömb típusa van. A bájtok JSON vagy Avro bináris kódolást használnak a kiválasztott serializációs formátum szerint, és követik a CES adatattribútumot Avro séma.

Important

2026. augusztus 15-től az AMQP protokoll elavult a változás eseményfolyam (CES) esetén. Platformonként vannak különbségek. A migrációs lépések és idővonalak számára lásd: AMQP protokoll elavultsága.

Ha alkalmazható, a leírások ebben a részben a CloudEvent specifikációból származnak, amely további részleteket tartalmaz.

Tulajdonságok

  • specversion:

    • Adattípus: Sztring
    • Kötelező CloudEvent attribútum
    • Az esemény által használt CloudEvents-specifikáció verziója. Ez a változat lehetővé teszi a kontextus értelmezését.
  • type

    • Adattípus: Sztring
    • Kötelező CloudEvent attribútum
    • Olyan értéket tartalmaz, amely a kiinduló eseményhez kapcsolódó esemény típusát írja le. Ennek az értéknek a formátumát a gyártó határozza meg, és tartalmazhat olyan információkat, mint a típus verziója. További információért lásd: A CloudEvents verziózása.
    • A change event streaming események esetében a típus jelenleg : com.microsoft.SQL.CES.DML.V{n}, ahol {n} a Microsoft change event streaming DML eseménysémájának változatát jelöli.
      • A jelenlegi legújabb séma verzió 1.
  • source

    • Adattípus: Sztring
    • Kötelező CloudEvent attribútum
    • Azonosítja azt a környezetet, amelyben egy esemény történt. A forrás és az ID kombinációjának egyedinek kell lennie minden eseménynél. Jelenleg ez a mező mindig az \/ SQL-ből streamelt események formájában kerül elküldésre.
  • id

    • Adattípus: Sztring
    • Kötelező CloudEvent attribútum
    • Azonosítja az eseményt. A producereknek biztosítaniuk kell, hogy a forrás és az ID kombinációja egyedi legyen minden egyes eseménynél. Ha egy ismétlődő esemény újraküldésre kerül (például hálózati hiba miatt), akkor ugyanaz az azonosító lehet. A fogyasztók feltételezhetik, hogy az azonos forrással és azonosítóval rendelkező események duplikáltak.
  • logicalid

    • Adattípus: Sztring
    • Bővítményattribútum
    • A megosztott logikai azonosítók azonosítják a megosztott üzeneteket (az Event Hubs üzenetméret-korlátozásai miatt).
  • time

    • Adattípus: Időbélyeg
    • Választható CloudEvent attribútum
    • UTC időbélyeg, amely azt mutatja, hogy a commit egy SQL tranzakción belül történt, amely eredetileg streamelt eseményt indít el.
  • datacontenttype

    • Adattípus: Sztring
    • Választható CloudEvent attribútum
    • Adatérték tartalomtípusa. Ez az attribútum lehetővé teszi, hogy az adatok bármilyen típusú tartalmat hordozzák, így a formátum és a kódolás eltérhet a választott eseményformátumtól. A JSON-borítékformátummal renderelt események például xml hasznos adatokat tartalmazhatnak az adatokban, és a fogyasztót ez az attribútum "application/xml" értékre állítja. Az adattartalom megjelenítésének szabályai datacontenttype különböző értékekhez az eseményformátum specifikációiban vannak meghatározva.
  • operation

    • Adattípus: Sztring
    • Bővítményattribútum
    • A végrehajtott SQL művelet típusát képviseli:
      • INS betétekhez
      • FRISSÍTÉS a frissítésekért
      • DEL a törléshez
  • segmentindex

    • Adattípus: Egész szám
    • Bővítményattribútum
    • Szegmens index, amely az üzenet helyzetét jelzi a logikai üzenet blokkjain belül. A szegmensindex információt nyújt arról, hogy az üzenet hol található logikai üzenettöredékek sorozatában. Ez a mező mindig jelen van. Használd logicalid, segmentindex, és finalsegment mezőket a bejövő események rendezéséhez, amelyek egy nagy SQL hasznos terhelést képviselnek, a konfigurált max_message_size_kb érték szerint.
  • finalsegment

    • Adattípus: Logikai
    • Bővítményattribútum
    • Jelzi, hogy ez a szegmens a sorozat utolsó szegmense. Ez a mező mindig jelen van, és segít azonosítani, hogy egy SQL esemény a konfigurált max_message_size_kb érték szerint aleseményekre lett-e osztva.
  • data

    • Adattípus: Byte array
    • Választható CloudEvent attribútum
    • Tartalmazza a változást leíró domainspecifikus eseményadatokat. Deserializáljuk a bájtokat JSON vagy Avro binárisként a kiválasztott serializációs formátum szerint. A deserializált adatok a CES adatattribútum, az Avro séma követését követik. A mezőiről információért lásd: Data attribútumformátum.

Megjegyzés:

Az üzenetfelosztás különálló az oszlop-érték levágástól. Mielőtt a CES sorozatosítaná az data attribútumot, minden 1 MB-nál nagyobb streamelt oszlopértéket 1 MB-ra rövidít. A CES ezután a létrehozott eseményt üzenet részekre osztja, ahogy szükséges, az alapján.max_message_size_kb

Példák

Példa JSON-üzenetre – beszúrás

{
  "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 üzenet példa – frissítés

{
  "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\\\"}\"}}"
}

Példa JSON-üzenetre – törlés

{
  "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\":\"{}\"}}"
}

Adatattribútum formátuma

Az data attribútum egy bájttömb. Deserializáljuk a bájtokat JSON vagy Avro binárisként a kiválasztott serializációs formátum szerint. Mindkét formátumban a kapott Data rekord a CES adatattribútum, Avro sémát követi, és két attribútumot tartalmaz:

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

A következő részek részletesebben magyarázzák el a deserializált attribútumokat.

eventsource

Az adatbázis metaadatait és azt a táblát ismerteti, amelyben az esemény történt:

  • db

    • Adattípus: Sztring
    • Leírás: Annak az adatbázisnak a neve, amelyben a tábla található.
    • Példa: EmployeesDb
  • schema

    • Adattípus: Sztring
    • Leírás: A táblát tartalmazó adatbázisséma.
    • Példa: dbo
  • tbl

    • Adattípus: Sztring
    • Leírás: Az a tábla, amelyben az esemény történt.
    • Példa: Employees
  • cols

    • Adattípus: Tömb
    • Leírás: A táblázat oszlopait részletező tömb.
      • name (string): Az oszlop neve.
      • type (string): Az oszlop SQL adattípusa, beleértve annak hosszát, pontosságát vagy méretarányát, ha alkalmazható. Ilyenek például a következők: int, nvarchar(50)és datetime2(7).
      • index (egész szám): Az oszlop indexe vagy pozíciója a táblázatban.
  • pkkey

    • Adattípus: Tömb
    • Leírás: Az elsődleges kulcsoszlopokat és azok értékeit jelöli az adott sor azonosításához.
      • columnname (string): Az elsődleges kulcsban használt oszlop neve.
      • value (string): Az oszlop értéke, amelyet a fő kulcs használ. Ez az érték segít egyedien azonosítani a sort.
  • transaction

    • Adattípus: Objektum
    • Leírás: Az adatműveletet tartalmazó SQL tranzakciót írja le.
      • commitlsn (string): A tranzakció commit log sorozatszáma (LSN).
      • beginlsn (string): Az ügylet kezdeti LSN-je.
      • sequencenumber (egész szám): Az adatművelet sorozatszáma a tranzakción belül. Ezt az értéket használd az események rendezésére egy tranzakción belül.
      • finalevent (boolean): Nem használatban van. Ennek a mezőnek mindig értéke .false
      • committime (string): Az a dátum és időpont, amikor a tranzakciót elkötelezték az adatbázisban.

Megjegyzés:

Az SQL termékeken, amelyek nem UTC időzónával vannak konfigurálva, a committime mező tévesen tartalmaz egy Z toldalad, pedig ez a mező a publikációs adatbázis helyi idejét mutatja. Amikor az adatbázis UTC-t használ, az érték és a zártagot megegyezik. Ez a probléma ismert, és javítás vár a funkció jövőbeli kiadásában.

eventrow

A sorszintű változásokat ismerteti, és összehasonlítja a rekord mezőinek régi és aktuális értékeit.

  • régi (sztringbe burkolt objektum): Az esemény előtti sor értékeit jelöli.
    • Minden kulcs-érték pár a következőkből áll:
      • <column_name>: (karakterlánc): Az oszlop neve.
      • <column_value>: (sztring/int/etc.): Az oszlop előző értéke.
  • current (sztringbe burkolt objektum): Az esemény utáni sor frissített értékeit jelöli.
    • A régi objektumhoz hasonlóan az egyes kulcs-érték párok a következőképpen épülnek fel:
      • <column_name> (karakterlánc): Az oszlop neve.
      • <column_value> (sztring/int/etc.): Az oszlop új vagy aktuális értéke.

CES CloudEvent Avro séma

{
  "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 adatattribútumok Avro séma

Használd a következő sémát a bájttömbnek deserializálása data során a natív JSON és Avro bináris CloudEvents programban:

{
  "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"
          }
        ]
      }
    }
  ]
}