Sémamódosítások replikációjának automatizálása az Azure SQL Data Syncben

A következőre vonatkozik: Azure SQL Database

Az SQL Data Sync lehetővé teszi, hogy a felhasználók egy vagy mindkét irányban szinkronizálják az adatokat az Azure SQL Database és az SQL Server-példányok adatbázisai között. Az SQL Data Sync egyik jelenlegi korlátozása, hogy nem támogatja a sémamódosítások replikálását. Minden alkalommal, amikor módosítja a táblázatsémát, manuálisan kell alkalmaznia a módosításokat az összes végponton, beleértve a központot és az összes tagot, majd frissítenie kell a szinkronizálási sémát.

Ez a cikk egy olyan megoldást mutat be, amely automatikusan replikálja a sémamódosításokat az összes SQL Data Sync-végpontra.

  1. Ez a megoldás egy DDL-eseményindítót használ a sémaváltozások nyomon követéséhez.
  2. Az eseményindító beszúrja a sémamódosítási parancsokat egy követési táblába.
  3. Ez a nyomkövetési tábla az adatszinkronizálási szolgáltatással szinkronizálódik az összes végpontra.
  4. A beszúrás utáni DML-eseményindítók a sémamódosítások más végpontokon való alkalmazásához használhatók.

Ez a cikk az ALTER TABLE-et használja példaként a sémamódosításra, de ez a megoldás más típusú sémamódosításokhoz is használható.

Fontos

Javasoljuk, hogy gondosan olvassa el ezt a cikket, különösen a hibaelhárítással és egyéb szempontokkal foglalkozó szakaszokat, mielőtt elkezdené implementálni az automatikus sémamódosítás-replikációt a szinkronizálási környezetben. Azt is javasoljuk, hogy több felhőbeli és helyszíni adatbázison keresztül olvassa el a Szinkronizálás adatokat az SQL Data Sync használatával. Egyes adatbázis-műveletek megszakíthatják a cikkben ismertetett megoldást. A problémák elhárításához további tartományismeretre lehet szükség az SQL Serverről és a Transact-SQL-ről.

Automating the replication of schema changes

Automatikus sémamódosítás-replikáció beállítása

Tábla létrehozása a sémamódosítások nyomon követéséhez

Hozzon létre egy táblát a szinkronizálási csoport összes adatbázisának sémaváltozásainak nyomon követéséhez:

CREATE TABLE SchemaChanges (
ID bigint IDENTITY(1,1) PRIMARY KEY,
SqlStmt nvarchar(max),
[Description] nvarchar(max)
)

Ez a táblázat egy identitásoszlopot tartalmaz a sémamódosítások sorrendjének nyomon követéséhez. Szükség esetén további mezőket is hozzáadhat további adatok naplózásához.

Tábla létrehozása a sémamódosítások előzményeinek nyomon követéséhez

Minden végponton hozzon létre egy táblát a legutóbb alkalmazott sémamódosítási parancs azonosítójának nyomon követéséhez.

CREATE TABLE SchemaChangeHistory (
LastAppliedId bigint PRIMARY KEY
)
GO

INSERT INTO SchemaChangeHistory VALUES (0)

Alter TABLE DDL-eseményindító létrehozása abban az adatbázisban, amelyben sémamódosítások történnek

Hozzon létre egy DDL-eseményindítót az ALTER TABLE-műveletekhez. Ezt az eseményindítót csak abban az adatbázisban kell létrehoznia, amelyben sémamódosítások történnek. Az ütközések elkerülése érdekében csak egy szinkronizálási csoportban engedélyezze a sémamódosításokat egy adatbázisban.

CREATE TRIGGER AlterTableDDLTrigger
ON DATABASE
FOR ALTER_TABLE
AS

-- You can add your own logic to filter ALTER TABLE commands instead of replicating all of them.

IF NOT (EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'nvarchar(512)') like 'DataSync')

INSERT INTO SchemaChanges (SqlStmt, Description)
    VALUES (EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)'), 'From DDL trigger')

Az eseményindító minden ALTER TABLE-parancshoz beszúr egy rekordot a sémaváltozás-követési táblába. Ez a példa szűrőt ad hozzá a séma DataSyncben végrehajtott sémamódosítások replikálásának elkerülése érdekében, mivel ezeket valószínűleg az Adatszinkronizálási szolgáltatás végzi. Ha csak bizonyos típusú sémamódosításokat szeretne replikálni, adjon hozzá további szűrőket.

További eseményindítókat is hozzáadhat más típusú sémamódosítások replikálásához. Létrehozhat például CREATE_PROCEDURE, ALTER_PROCEDURE és DROP_PROCEDURE eseményindítókat a tárolt eljárások módosításainak replikálásához.

Eseményindító létrehozása más végpontokon sémamódosítások beszúrása során történő alkalmazásához

Ez az eseményindító végrehajtja a sémamódosítási parancsot, amikor más végpontokkal van szinkronizálva. Ezt az eseményindítót az összes végponton létre kell hoznia, kivéve azt, amelyikben sémamódosítások történnek (vagyis abban az adatbázisban, ahol a DDL-eseményindítót AlterTableDDLTrigger az előző lépésben hozták létre).

CREATE TRIGGER SchemaChangesTrigger
ON SchemaChanges
AFTER INSERT
AS
DECLARE @lastAppliedId bigint
DECLARE @id bigint
DECLARE @sqlStmt nvarchar(max)
SELECT TOP 1 @lastAppliedId=LastAppliedId FROM SchemaChangeHistory
SELECT TOP 1 @id = id, @SqlStmt = SqlStmt FROM SchemaChanges WHERE id > @lastAppliedId ORDER BY id
IF (@id = @lastAppliedId + 1)
BEGIN
    EXEC sp_executesql @SqlStmt
        UPDATE SchemaChangeHistory SET LastAppliedId = @id
    WHILE (1 = 1)
    BEGIN
        SET @id = @id + 1
        IF exists (SELECT id FROM SchemaChanges WHERE ID = @id)
            BEGIN
                SELECT @sqlStmt = SqlStmt FROM SchemaChanges WHERE ID = @id
                EXEC sp_executesql @SqlStmt
                UPDATE SchemaChangeHistory SET LastAppliedId = @id
            END
        ELSE
            BREAK;
    END
END

Ez az eseményindító a beszúrás után fut, és ellenőrzi, hogy az aktuális parancs fut-e legközelebb. A kódlogika biztosítja, hogy a rendszer ne hagyja ki a sémamódosítási utasítást, és a rendszer akkor is alkalmazza az összes módosítást, ha a beszúrás nem megfelelő.

A sémaváltozás-követési tábla szinkronizálása az összes végpontra

A sémaváltozás-követő táblát a meglévő szinkronizálási csoport vagy egy új szinkronizálási csoport használatával szinkronizálhatja az összes végponttal. Győződjön meg arról, hogy a nyomkövetési tábla módosításai szinkronizálhatók az összes végponttal, különösen akkor, ha egyirányú szinkronizálást használ.

Ne szinkronizálja a sémamódosítási előzménytáblát, mivel ez a tábla eltérő állapotot tart fenn a különböző végpontokon.

Sémamódosítások alkalmazása szinkronizálási csoportban

A rendszer csak a DDL-eseményindítót létrehozó adatbázisban végrehajtott sémamódosításokat replikálja. A más adatbázisokban végrehajtott sémamódosítások nem replikálódnak.

Miután a séma módosításait replikálta az összes végpontra, további lépéseket kell tennie a szinkronizálási séma frissítéséhez az új oszlopok szinkronizálásának elindításához vagy leállításához.

Új oszlopok hozzáadása

  1. Módosítsa a sémát.

  2. Az eseményindítót létrehozó lépés befejezéséig ne módosítsa az új oszlopokat tartalmazó adatváltozásokat.

  3. Várja meg, amíg a sémamódosítások az összes végpontra érvényesek lesznek.

  4. Frissítse az adatbázissémát, és adja hozzá az új oszlopot a szinkronizálási sémához.

  5. Az új oszlopban lévő adatok szinkronizálása a következő szinkronizálási művelet során történik.

Oszlopok eltávolítása

  1. Távolítsa el az oszlopokat a szinkronizálási sémából. Az Adatszinkronizálás leállítja az adatok szinkronizálását ezekben az oszlopokban.

  2. Módosítsa a sémát.

  3. Frissítse az adatbázissémát.

Adattípusok frissítése

  1. Módosítsa a sémát.

  2. Várja meg, amíg a sémamódosítások az összes végpontra érvényesek lesznek.

  3. Frissítse az adatbázissémát.

  4. Ha az új és a régi adattípusok nem teljes mértékben kompatibilisek – például váltáskor intbigint – a szinkronizálás meghiúsulhat, mielőtt az eseményindítókat létrehozó lépések befejeződnek. Az újrapróbálkozások után a szinkronizálás sikeres lesz.

Oszlopok vagy táblák átnevezése

Az oszlopok vagy táblák átnevezése leállítja az Adatszinkronizálás működését. Hozzon létre egy új táblát vagy oszlopot, töltse ki újra az adatokat, majd átnevezés helyett törölje a régi táblát vagy oszlopot.

Más típusú sémamódosítások

Más típusú sémamódosítások esetén – például tárolt eljárások létrehozása vagy index elvetése – nem szükséges frissíteni a szinkronizálási sémát.

Automatikus sémamódosítás-replikáció hibaelhárítása

A cikkben ismertetett replikációs logika bizonyos helyzetekben leáll, például ha olyan sémamódosítást hajtott végre egy helyszíni adatbázisban, amelyet az Azure SQL Database nem támogat. Ebben az esetben a sémaváltozás-követési tábla szinkronizálása meghiúsul. A problémát manuálisan kell megoldania:

  1. Tiltsa le a DDL-eseményindítót, és kerülje a további sémamódosításokat a probléma megoldásáig.

  2. A végpontadatbázisban, ahol a probléma történik, tiltsa le az AFTER INSERT eseményindítót azon a végponton, ahol a sémamódosítás nem végezhető el. Ez a művelet lehetővé teszi a sémamódosítási parancs szinkronizálását.

  3. A sémaváltozás-követési tábla szinkronizálásához aktiválja a szinkronizálást.

  4. A végpontadatbázisban, ahol a probléma történik, kérje le a sémamódosítási előzménytáblát a legutóbb alkalmazott sémamódosítási parancs azonosítójának lekéréséhez.

  5. A sémamódosítás-követési táblázat lekérdezésével listázhatja az összes parancsot az előző lépésben lekért azonosítónál nagyobb azonosítóval.

    a. Hagyja figyelmen kívül azokat a parancsokat, amelyeket nem lehet végrehajtani a végpontadatbázisban. Foglalkoznia kell a séma inkonzisztencia. Ha az inkonzisztencia hatással van az alkalmazásra, állítsa vissza az eredeti sémamódosításokat.

    b. Manuálisan alkalmazza azokat a parancsokat, amelyeket alkalmazni kell.

  6. Frissítse a sémamódosítási előzménytáblát, és állítsa az utolsó alkalmazott azonosítót a megfelelő értékre.

  7. Ellenőrizze, hogy a séma naprakész-e.

  8. Engedélyezze újra a második lépésben letiltott AFTER INSERT eseményindítót.

  9. Az első lépésben engedélyezze újra a letiltott DDL-eseményindítót.

Ha törölni szeretné a sémaváltozás-követési táblában lévő rekordokat, a TRUNCATE helyett használja a DELETE parancsot. Soha ne állítsa újra újra az identitásoszlopot a sémaváltozás-követési táblában a DBCC CHECKIDENT használatával. Új sémamódosítás-követő táblákat hozhat létre, és szükség esetén frissítheti a tábla nevét a DDL-eseményindítóban.

Egyéb szempontok

  • A központot és tagadatbázisokat konfiguráló adatbázis-felhasználóknak elegendő engedéllyel kell rendelkezniük a sémamódosítási parancsok végrehajtásához.

  • A DDL-eseményindítóban további szűrőket is hozzáadhat, hogy csak a kijelölt táblákban vagy műveletekben replikálja a sémamódosítást.

  • Csak abban az adatbázisban végezhet sémamódosítást, amelyben a DDL-eseményindító létrejön.

  • Ha módosít egy SQL Server-adatbázist, győződjön meg arról, hogy a sémamódosítás támogatott az Azure SQL Database-ben.

  • Ha a sémamódosítások a DDL-eseményindítót létrehozó adatbázistól eltérő adatbázisokban történnek, a rendszer nem replikálja a módosításokat. A probléma elkerülése érdekében DDL-eseményindítókat hozhat létre, hogy letiltsa a módosításokat más végpontokon.

  • Ha módosítania kell a sémamódosítás-követő tábla sémáját, a módosítás előtt tiltsa le a DDL-eseményindítót, majd alkalmazza manuálisan a módosítást az összes végpontra. A séma frissítése egy AFTER INSERT eseményindítóban ugyanazon a táblán nem működik.

  • Ne használja újra az identitásoszlopot a DBCC CHECKIDENT használatával.

  • Ne használja a TRUNCATE-t a sémaváltozás-követési táblában lévő adatok törléséhez.

További lépések

További információ az SQL Data Syncről: