Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Managed Instance
Som standard gör transaktionsreplikering alla dataändringar hos Prenumeranter genom lagrade procedurer som genereras av interna procedurer, för varje tabellartikel i publikationen. De tre procedurerna (en var för infogningar, uppdateringar och borttagningar) kopieras till Prenumeranten och körs när en infogning, uppdatering eller borttagning replikeras till prenumeranten.
När en schemaändring görs i en tabell i en SQL Server Publisher återskapar replikeringen dessa procedurer automatiskt genom att anropa samma uppsättning interna skriptprocedurer så att de nya procedurerna matchar det nya schemat (replikering av schemaändringar stöds inte för Oracle Publishers).
Du kan också ange anpassade procedurer för att ersätta en eller flera av standardprocedurerna. De anpassade procedurerna bör ändras om schemaändringen påverkar proceduren. Om en procedur till exempel refererar till en kolumn som tas bort i en schemaändring, bör referenser till kolumnen tas bort från proceduren.
Det finns två sätt för replikering att sprida en ny anpassad procedur till prenumeranter:
- Använd en anpassad skriptprocedur för att ersätta standardvärdena som används av replikering
- Använda ett skript som innehåller en ny definition för anpassad procedur
Använd en anpassad skriptprocedur för att ersätta standardvärdena som används av replikering
När du kör sp_addarticle kontrollerar du att den @schema_option0x02 biten är till true.
Anmärkning
Definitionen för anpassad lagrad procedur måste skrivas med dynamisk Transact-SQL i en lagrad wrapper-procedur. Den här lagrade omslutningsproceduren måste också innehålla en @artid parameter av typen int för att säkerställa att den skapas på prenumeranten.
Kör sp_register_custom_scripting och ange värdet insert, updateeller delete för parametern @type och namnet på den anpassade skriptproceduren för parametern @value .
Nästa gång en schemaändring görs anropar replikeringen den här lagrade proceduren för att skriva ut definitionen för den nya användardefinierade anpassade lagrade proceduren och sprider sedan proceduren till varje prenumerant.
Exempel
I det här exemplet förutsätter du att utgivaren och prenumeranten redan är konfigurerade och att du vill skapa en anpassad delete lagrad procedur.
I Prenumeranten skapar du en tabell för att visa det anpassade borttagningsskriptet.
USE [SubscriberDB]; GO CREATE TABLE DeleteLogging (id INT PRIMARY KEY); GOLägg till artikeln från Publisher. Observera värdena för parametrarna
@schema_option,@ins_cmd,@upd_cmdoch@del_cmd:USE [PublisherDB]; EXECUTE sp_addarticle @publication = N'PubName1', @article = N'Purchases', @source_owner = N'dbo', @source_object = N'Purchases', @type = N'logbased', @description = NULL, @creation_script = NULL, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'manual', @destination_table = N'Purchases', @destination_owner = N'dbo', @vertical_partition = N'false', @ins_cmd = N'CALL sp_MSins_dboPurchases', -- default @del_cmd = N'CALL custom_delete', -- custom @upd_cmd = N'SCALL sp_MSupd_dboPurchases'; -- default GOSkapa en lagrad procedur som skriptar ut den
custom_deletelagrade procedur som du vill använda på prenumeranten. Det här är den omslutningsprocedur som tidigare angivits.Om du returnerar värden som inte är noll från den här lagrade proceduren, resulterar det i att
custom_deleteinte skapas på prenumeranten.SELECTska returnera den fullständiga definitionen av den lagrade proceduren som ska användas på prenumeranten.Observera användningen av den obligatoriska
@artidparametern.USE [PublisherDB]; GO CREATE OR ALTER PROCEDURE script_custom_delete (@artid INT) AS BEGIN SELECT 'CREATE OR ALTER PROCEDURE custom_delete @pkc1 INT AS BEGIN INSERT INTO DeleteLogging (id) VALUES (@pkc1) END'; RETURN 0; END GORegistrera det anpassade skriptet i Publisher.
USE [PublisherDB]; GO EXECUTE sp_register_custom_scripting @type = 'delete', @value = 'script_custom_delete', @publication = 'PubName1', @article = 'Purchases'; GOLägg till en prenumeration. I det här exemplet är parametern
@sync_typeinställd påreplication support only, så ingen ögonblicksbild används.USE [PublisherDB]; GO EXECUTE sp_addsubscription @publication = N'PubName1', @subscriber = @@SERVERNAME, @destination_db = N'SubscriberDB', @subscription_type = N'Push', @sync_type = N'replication support only', @article = N'all', @update_mode = N'read only', @subscriber_type = 0; GO
Använda ett skript som innehåller en ny definition för anpassad procedur
När du kör sp_addarticle, sätt @schema_option0x02-biten till false så att replikeringen inte automatiskt genererar anpassade procedurer på prenumeranten.
Innan varje schemaändring skapar du en ny skriptfil och registrerar skriptet med replikering genom att köra sp_register_custom_scripting. Ange värdet custom_script för parametern @type och sökvägen till skriptet i Publisher för parametern @value .
Nästa gång en relevant schemaändring görs körs det här skriptet på varje prenumerant inom samma transaktion som DDL-kommandot. När schemaändringen har gjorts avregistreras skriptet. Du måste registrera skriptet igen för att det ska köras efter en efterföljande schemaändring.