Dela via


JSON-meddelandeformat – ändra händelseströmning

Förhandsversion av SQL Server 2025 (17.x)

I den här artikeln beskrivs JSON-formatet för ett CloudEvents-meddelande som strömmas från SQL Server till Azure Event Hubs när du använder funktionen för ändringshändelseströmning (CES) som introducerades i SQL Server 2025 (17.x) Preview.

Anmärkning

Ändringshändelseströmning är för närvarande i förhandsversion för SQL Server 2025.

Översikt

Händelser som genereras av ändringshändelseströmning följer CloudEvents-specifikationen , vilket gör dem enkla att integrera med händelsedrivna system. Alla CES CloudEvents innehåller 11 attribut (fält). CES kan konfigureras för att serialisera CloudEvents som JSON (intern) eller som Binär Avro. I följande avsnitt i den här artikeln beskrivs meddelandeformatet i detalj, inklusive CES CloudEvent-attribut och serialisering.

I tillämpliga fall hämtas beskrivningarna i det här avsnittet från CloudEvent-specifikationen, som innehåller ytterligare information.

Egenskaper

  • specversion:

    • Datatyp: Sträng
    • Obligatoriskt CloudEvent-attribut
    • Den version av CloudEvents-specifikationen som händelsen använder. Detta möjliggör tolkning av kontexten.
  • type

    • Datatyp: Sträng
    • Obligatoriskt CloudEvent-attribut
    • Innehåller ett värde som beskriver vilken typ av händelse som är relaterad till den ursprungliga förekomsten. Ofta används det här attributet för routning, observerbarhet eller principframtvingande. Formatet för detta definieras av producenten och kan innehålla information som typens version. Mer information finns i Versionshantering av CloudEvents.
  • source

    • Datatyp: Sträng
    • Obligatoriskt CloudEvent-attribut
    • Identifierar kontexten där en händelse inträffade. Källa + ID måste vara unikt för varje händelse.
  • id

    • Datatyp: Sträng
    • Obligatoriskt CloudEvent-attribut
    • Identifierar händelsen. Producenter måste se till att källa + ID är unikt för varje distinkt händelse. Om en duplicerad händelse inte används igen (till exempel på grund av ett nätverksfel) kan den ha samma ID. Konsumenterna kan anta att händelser med identisk källa och ID är dubbletter.
  • logicalid

    • Datatyp: Sträng
    • Tilläggsattribut
    • Delade meddelanden (på grund av storleksbegränsningar för Event Hubs msg) identifieras av delade logiska ID:er.
  • time

    • Datatyp: Tidsstämpel
    • Valfritt CloudEvent-attribut
    • Tidsstämpel för när händelsen inträffade. Om tidpunkten för händelsen inte kan fastställas kan det här attributet anges till en annan tid (till exempel den aktuella tiden) av CloudEvents-producenten. Alla producenter för samma källa måste vara konsekventa i detta avseende – antingen använder de alla den faktiska tiden för händelsen, eller så använder de alla samma algoritm för att fastställa vilket värde som används.
  • datacontenttype

    • Datatyp: Sträng
    • Valfritt CloudEvent-attribut
    • Innehållstyp för datavärde. Det här attributet gör det möjligt för data att bära alla typer av innehåll, vilket innebär att format och kodning kan skilja sig från det valda händelseformatet. En händelse som återges med hjälp av JSON-kuvertformatet kan till exempel ha en XML-nyttolast i data, och konsumenten informeras om att det här attributet är inställt på "application/xml". Reglerna för hur datainnehåll återges för olika datacontenttype värden definieras i specifikationerna för händelseformat. Till exempel definierar JSON-händelseformatet relationen i avsnitt 3.1.
  • operation

    • Datatyp: Sträng
    • Förlängning
    • Representerar den typ av SQL-åtgärd som inträffade.
  • segmentindex

    • Datatyp: Heltal
    • Tilläggsattribut
    • Segmentindex, som anger positionen för meddelandet i de logiska meddelandesegmenten. Segmentindexet innehåller information om var meddelandet står i sekvensen med logiska meddelandefragment. I den här implementeringen av ändringshändelseströmning finns det här fältet alltid.
  • finalsegment

    • Datatyp: Boolesk
    • Tilläggsattribut
    • Anger om det här segmentet är det sista segmentet i sekvensen. I den här implementeringen av ändringshändelseströmning finns det här fältet alltid.
  • data

    • Datatyp: Sträng
    • Valfritt CloudEvent-attribut
    • Domänspecifika händelsedata. För CES är data sträng som kan parsas som JSON. Den här JSON-filen beskriver hur data har ändrats. Dataattributets format är i dataattributformat.

Exempel

JSON-meddelandeexempel – infoga

{
  "specversion": "1.0",
  "type": "com.microsoft.SQL.CES.DML.V1",
  "source": "\/",
  "id": "d43f09a6-d13b-4902-86d4-17bdb5edb872",
  "logicalid": "9c8d4ad2-bf54-4f10-a96f-038af496997f:0000002C00000300017C:00000000000000000001",
  "time": "2025-03-14T16:45:20.650Z",
  "datacontenttype": "application\/json",
  "operation": "INS",
  "splitindex": 0,
  "splittotalcnt": 0,
  "data": "{\n  \"eventsource\": {\n    \"db\": \"db1\",\n    \"schema\": \"dbo\",\n    \"tbl\": \"Purchases\",\n    \"cols\": [\n      {\n        \"name\": \"purchase_id\",\n        \"type\": \"int\",\n        \"index\": 0\n      },\n      {\n        \"name\": \"customer_name\",\n        \"type\": \"varchar(100)\",\n        \"index\": 1\n      },\n      {\n        \"name\": \"product_id\",\n        \"type\": \"int\",\n        \"index\": 2\n      },\n      {\n        \"name\": \"product_name\",\n        \"type\": \"varchar(100)\",\n        \"index\": 3\n      },\n      {\n        \"name\": \"price_per_item\",\n        \"type\": \"int\",\n        \"index\": 4\n      },\n      {\n        \"name\": \"quantity\",\n        \"type\": \"int\",\n        \"index\": 5\n      },\n      {\n        \"name\": \"purchase_date\",\n        \"type\": \"datetime\",\n        \"index\": 6\n      },\n      {\n        \"name\": \"payment_method\",\n        \"type\": \"varchar(50)\",\n        \"index\": 7\n      }\n    ],\n    \"pkkey\": [\n      {\n        \"columnname\": \"purchase_id\",\n        \"value\": \"105\"\n      }\n    ]\n  },\n  \"eventrow\": {\n    \"old\": \"{}\",\n    \"current\": \"{\\\"purchase_id\\\": \\\"105\\\", \\\"customer_name\\\": \\\"Anna Doe\\\", \\\"product_id\\\": \\\"101\\\", \\\"product_name\\\": \\\"Game 2077\\\", \\\"price_per_item\\\": \\\"60\\\", \\\"quantity\\\": \\\"1\\\", \\\"purchase_date\\\": \\\"2025-03-14 16:45:01.000\\\", \\\"payment_method\\\": \\\"Credit Card\\\"}\"\n  }\n}"
}

JSON-meddelandeexempel – uppdaterat

{
  "specversion": "1.0",
  "type": "com.microsoft.SQL.CES.DML.V1",
  "source": "\/",
  "id": "c425575f-00bb-45cf-acec-c55fdc7d08cd",
  "logicalid": "9c8d4ad2-bf54-4f10-a96f-038af496997f:0000002C000003500004:00000000000000000001",
  "time": "2025-03-14T16:49:59.567Z",
  "datacontenttype": "application\/json",
  "operation": "UPD",
  "splitindex": 0,
  "splittotalcnt": 0,
  "data": "{\n  \"eventsource\": {\n    \"db\": \"db1\",\n    \"schema\": \"dbo\",\n    \"tbl\": \"Purchases\",\n    \"cols\": [\n      {\n        \"name\": \"purchase_id\",\n        \"type\": \"int\",\n        \"index\": 0\n      },\n      {\n        \"name\": \"customer_name\",\n        \"type\": \"varchar(100)\",\n        \"index\": 1\n      },\n      {\n        \"name\": \"product_id\",\n        \"type\": \"int\",\n        \"index\": 2\n      },\n      {\n        \"name\": \"product_name\",\n        \"type\": \"varchar(100)\",\n        \"index\": 3\n      },\n      {\n        \"name\": \"price_per_item\",\n        \"type\": \"int\",\n        \"index\": 4\n      },\n      {\n        \"name\": \"quantity\",\n        \"type\": \"int\",\n        \"index\": 5\n      },\n      {\n        \"name\": \"purchase_date\",\n        \"type\": \"datetime\",\n        \"index\": 6\n      },\n      {\n        \"name\": \"payment_method\",\n        \"type\": \"varchar(50)\",\n        \"index\": 7\n      }\n    ],\n    \"pkkey\": [\n      {\n        \"columnname\": \"purchase_id\",\n        \"value\": \"105\"\n      }\n    ]\n  },\n  \"eventrow\": {\n    \"old\": \"{}\",\n    \"current\": \"{\\\"purchase_id\\\": \\\"105\\\", \\\"customer_name\\\": \\\"Anna Doe\\\", \\\"product_id\\\": \\\"100\\\", \\\"product_name\\\": \\\"Game 2066\\\", \\\"price_per_item\\\": \\\"50\\\", \\\"quantity\\\": \\\"2\\\", \\\"purchase_date\\\": \\\"2025-03-14 16:45:01.000\\\", \\\"payment_method\\\": \\\"Credit Card\\\"}\"\n  }\n}"
}

JSON-meddelandeexempel – ta bort

{
  "specversion": "1.0",
  "type": "com.microsoft.SQL.CES.DML.V1",
  "source": "\/",
  "id": "24fa0c2c-c45d-4abf-9a8d-fba04c29fc86",
  "logicalid": "9c8d4ad2-bf54-4f10-a96f-038af496997f:0000002C000003600019:00000000000000000001",
  "time": "2025-03-14T16:51:39.613Z",
  "datacontenttype": "application\/json",
  "operation": "DEL",
  "splitindex": 0,
  "splittotalcnt": 0,
  "data": "{\n  \"eventsource\": {\n    \"db\": \"db1\",\n    \"schema\": \"dbo\",\n    \"tbl\": \"Purchases\",\n    \"cols\": [\n      {\n        \"name\": \"purchase_id\",\n        \"type\": \"int\",\n        \"index\": 0\n      },\n      {\n        \"name\": \"customer_name\",\n        \"type\": \"varchar(100)\",\n        \"index\": 1\n      },\n      {\n        \"name\": \"product_id\",\n        \"type\": \"int\",\n        \"index\": 2\n      },\n      {\n        \"name\": \"product_name\",\n        \"type\": \"varchar(100)\",\n        \"index\": 3\n      },\n      {\n        \"name\": \"price_per_item\",\n        \"type\": \"int\",\n        \"index\": 4\n      },\n      {\n        \"name\": \"quantity\",\n        \"type\": \"int\",\n        \"index\": 5\n      },\n      {\n        \"name\": \"purchase_date\",\n        \"type\": \"datetime\",\n        \"index\": 6\n      },\n      {\n        \"name\": \"payment_method\",\n        \"type\": \"varchar(50)\",\n        \"index\": 7\n      }\n    ],\n    \"pkkey\": [\n      {\n        \"columnname\": \"purchase_id\",\n        \"value\": \"105\"\n      }\n    ]\n  },\n  \"eventrow\": {\n    \"old\": \"{\\\"purchase_id\\\": \\\"105\\\", \\\"customer_name\\\": \\\"Anna Doe\\\", \\\"product_id\\\": \\\"100\\\", \\\"product_name\\\": \\\"Game 2066\\\", \\\"price_per_item\\\": \\\"50\\\", \\\"quantity\\\": \\\"2\\\", \\\"purchase_date\\\": \\\"2025-03-14 16:45:01.000\\\", \\\"payment_method\\\": \\\"Credit Card\\\"}\",\n    \"current\": \"{}\"\n  }\n}"
}

Dataattributformat

Data är ett JSON-objekt omslutet i strängattribut som innehåller två attribut:

  • eventSource
  • eventRow
"data": "{ "eventsource": {<eventSource>}, "eventdata": {<eventData>}}"

Information om dessa två attribut förklaras mer detaljerat i följande avsnitt:

eventsource

Beskriver metadata om databasen och tabellen där händelsen inträffade:

  • db

    • Datatyp: Sträng
    • Beskrivning: Namnet på databasen där tabellen finns.
    • Exempel: cessqldb001
  • schema

    • Datatyp: Sträng
    • Beskrivning: Databasschemat som innehåller tabellen.
    • Exempel: dbo
  • tbl

    • Datatyp: Sträng
    • Beskrivning: Tabellen där händelsen inträffade.
    • Exempel: Purchases
  • cols

    • Datatyp: Matris
    • Beskrivning: En matris som beskriver kolumnerna i tabellen.
      • name (string): Namnet på kolumnen.
      • type (string): Datatypen för kolumnen (VARCHAR eller INT).
      • index (heltal): Kolumnens index eller position i tabellen.
  • pkkey

    • Datatyp: Matris
    • Beskrivning: Representerar primärnyckelkolumnerna och deras värden för att identifiera den specifika raden.
      • columnname (sträng): Namnet på kolumnen som används i primärnyckeln.
      • value (string/int/etc.): Värdet för kolumnen som används i primärnyckeln hjälper till att unikt identifiera raden.

eventrow

Beskriver ändringar på radnivå och jämför de gamla och aktuella värdena för fälten i posten.

  • old (object wrapped in string): Representerar värdena på raden före händelsen.
    • Varje nyckel/värde-par består av:
      • <column_name>: (sträng): Namnet på kolumnen.
      • <column_value>: (string/int/etc.): Föregående värde för kolumnen.
  • current (object wrapped in string): Representerar de uppdaterade värdena på raden efter händelsen.
    • Liknar det gamla objektet med varje nyckel/värde-par strukturerat som:
      • <column_name> (sträng): Namnet på kolumnen.
      • <column_value> (string/int/etc.): Det nya eller aktuella värdet för den kolumnen.

CES CloudEvent JSON-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"
    }
  ]
}

JSON-schema för CES-dataattribut

{
  "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": "committime",
                  "type": "string"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "name": "eventrow",
      "type": {
        "name": "EventRow",
        "type": "record",
        "fields": [
          {
            "name": "old",
            "type": "string"
          },
          {
            "name": "current",
            "type": "string"
          }
        ]
      }
    }
  ]
}