Jak Wdrożenie obsługi logiki biznesowej korespondencji seryjnej artykuł (Programowanie replikacji)
Microsoft.SqlServer.Replication.BusinessLogicSupport Nazw implementuje interfejs, który umożliwia pisanie złożonej logika biznesowa do obsługi zdarzeń, które występują podczas procesu synchronizacji replikacja scalająca.Metody w obsługa logika biznesowa mogą zostać wywołane przez proces replikacja dla każdego wiersza zmienionych, który jest replikowany podczas synchronizacji.
Ogólny proces wykonywania obsługa logika biznesowa jest:
Tworzenie wirtualny plik dziennika hander logika biznesowa.
Zarejestrować wirtualny plik dziennika u dystrybutora.
Wdrażanie wirtualny plik dziennika na serwerze, na którym uruchomiony jest Agent scalania.Subskrypcji ściąganej agent jest uruchamiany na subskrybenta i subskrypcja wypychana agent działa na dystrybutora.Podczas korzystania z sieci synchronizacja w sieci Web, agent jest uruchamiany na serwerze sieci Web.
Tworzenie artykuł używa obsługa logika biznesowa lub zmodyfikować istniejące artykuł używać obsługa logika biznesowa.
obsługa logika biznesowa Określić jest wykonywane dla każdego wiersza, który jest synchronizowany.Złożone logikę i wywołań do innych aplikacji lub usług sieciowych może obniżyć wydajność.Aby uzyskać więcej informacji dotyczących obsługi logika biznesowa, zobacz Wykonywanie reguł biznesowych podczas synchronizacji korespondencji seryjnej.
Aby utworzyć i wdrożyć obsługi logika biznesowa
W Microsoft programu Visual Studio, tworzenie nowego projektu.wirtualny plik dziennika netto, który zawiera kod, który implementuje obsługa logika biznesowa.
Dodaj odwołania do projektu dla następujących obszarów nazw.
Odwołanie do zestawu
Lokalizacja
C:\Program Files\Microsoft SQL Server\100\COM (instalacji domyślnej)
GAC (składnik.NET Framework)
GAC (składnik.NET Framework)
Add class, który zastępuje BusinessLogicModule klasy
Wdrożenie HandledChangeStates właściwość, aby wskazać typy zmian, które są obsługiwane.
Zastąpienie jednego lub więcej z następujących metod BusinessLogicModule klasy:
CommitHandler-wywoływana, gdy zmiana danych jest zobowiązana podczas synchronizacji.
DeleteErrorHandler-wywoływana, gdy wystąpi błąd, gdy Instrukcja DELETE jest przekazywane lub pobrać.
DeleteHandler-wywoływana, gdy usuwanie sprawozdania są przekazywane lub pobrać.
InsertErrorHandler-wywoływana, gdy wystąpi błąd, gdy instrukcja INSERT jest przekazywane lub pobrać.
InsertHandler-wywoływana, gdy instrukcji INSERT są przekazywane lub pobrać.
UpdateConflictsHandler-wywoływana, gdy występują konflikty instrukcji UPDATE w Wydawca i abonenta.
UpdateDeleteConflictHandler-wywoływana, gdy instrukcji UPDATE konflikt z instrukcji DELETE na Wydawca i abonenta.
UpdateErrorHandler-wywoływana, gdy wystąpi błąd, gdy instrukcja UPDATE jest przekazywane lub pobrać.
UpdateHandler-wywoływana, gdy aktualizacja sprawozdania są przekazywane lub pobrać.
Skompiluj projekt, aby utworzyć obsługa logika biznesowa wirtualny plik dziennika.
Wdrażanie wirtualny plik dziennika w katalogu zawierającego plik wykonywalny w scalić Agent (replmerg.exe), który domyślnej instalacji jest C:\Program Files\Microsoft SQL Server\100\COM, lub zainstaluj go.NET Global Assembly Cache (GAC).Nie należy instalować wirtualny plik dziennika w pamięci podręcznej GAC Jeśli aplikacje inne niż agenta scalić wymagają dostępu do wirtualny plik dziennika.Można zainstalować wirtualny plik dziennika w pamięci podręcznej GAC przy użyciu narzędzie pamięci podręcznej zestawów globalnych (Gacutil.exe) w.NET Framework SDK.
Ostrzeżenie
A obsługa logika biznesowa muszą być wdrożone na każdym serwerze, na którym działa Agent scalanie, zawierającą serwer IIS, obsługującym replisapi.dll podczas korzystania z sieci synchronizacja w sieci Web.
Aby zarejestrowaćobsługa logika biznesowa
Wydawca, należy wykonać sp_enumcustomresolvers (języka Transact-SQL) zweryfikować, że zgromadzenie nie jest już zarejestrowany jako obsługa logika biznesowa.
U dystrybutora, wykonać sp_registercustomresolver (języka Transact-SQL), określając przyjazną nazwę dla obsługa logika biznesowa dla @ article_resolver, wartość true dla @ is_dotnet_assembly, nazwa wirtualny plik dziennika dla @ dotnet_assembly_namei w pełni kwalifikowaną nazwę klasy, która zastępuje BusinessLogicModule dla @ dotnet_class_name.
Ostrzeżenie
Jeżeli Zgromadzenie nie jest wdrożona w tym samym katalogu co Agent Scal pliki wykonywalne, w tym samym katalogu jako Agent scalić to synchronicznie uruchamiania aplikacji lub w Global Assembly Cache (GAC), należy określić pełną ścieżka z nazwę wirtualny plik dziennika @ dotnet_assembly_name.Podczas korzystania z sieci synchronizacja w sieci Web, należy określić lokalizację wirtualny plik dziennika na serwerze sieci Web.
Aby użyć obsługa logika biznesowa z nowego artykuł tabela
- Wykonanie sp_addmergearticle (języka Transact-SQL) do definiowania artykuł, określający przyjazną nazwę obsługa logika biznesowa dla @ article_resolver.Aby uzyskać więcej informacji, zobacz Jak Definiowanie artykuł (Programowanie replikacji Transact-SQL).
Aby użyć obsługa logika biznesowa z istniejącego artykuł tabela
- Wykonanie sp_changemergearticle (języka Transact-SQL), określając publikacja @, @ artykuł, wartość article_resolver dla @ Właściwośći przyjazną nazwę obsługa logika biznesowa dla wartość @.
Przykład
W tym przykładzie obsługa logika biznesowa który tworzy dziennik inspekcji.
using System;
using System.Text;
using System.Data;
using System.Data.Common;
using Microsoft.SqlServer.Replication.BusinessLogicSupport;
using Microsoft.Samples.SqlServer.BusinessLogicHandler;
namespace Microsoft.Samples.SqlServer.BusinessLogicHandler
{
public class OrderEntryBusinessLogicHandler :
Microsoft.SqlServer.Replication.BusinessLogicSupport.BusinessLogicModule
{
// Variables to hold server names.
private string publisherName;
private string subscriberName;
public OrderEntryBusinessLogicHandler()
{
}
// Implement the Initialize method to get publication
// and subscription information.
public override void Initialize(
string publisher,
string subscriber,
string distributor,
string publisherDB,
string subscriberDB,
string articleName)
{
// Set the Publisher and Subscriber names.
publisherName = publisher;
subscriberName = subscriber;
}
// Declare what types of row changes, conflicts, or errors to handle.
override public ChangeStates HandledChangeStates
{
get
{
// Handle Subscriber inserts, updates and deletes.
return ChangeStates.SubscriberInserts |
ChangeStates.SubscriberUpdates | ChangeStates.SubscriberDeletes;
}
}
public override ActionOnDataChange InsertHandler(SourceIdentifier insertSource,
DataSet insertedDataSet, ref DataSet customDataSet, ref int historyLogLevel,
ref string historyLogMessage)
{
if (insertSource == SourceIdentifier.SourceIsSubscriber)
{
// Build a line item in the audit message to log the Subscriber insert.
StringBuilder AuditMessage = new StringBuilder();
AuditMessage.Append(String.Format("A new order was entered at {0}. " +
"The SalesOrderID for the order is :", subscriberName));
AuditMessage.Append(insertedDataSet.Tables[0].Rows[0]["SalesOrderID"].ToString());
AuditMessage.Append("The order must be shipped by :");
AuditMessage.Append(insertedDataSet.Tables[0].Rows[0]["DueDate"].ToString());
// Set the reference parameter to write the line to the log file.
historyLogMessage = AuditMessage.ToString();
// Set the history log level to the default verbose level.
historyLogLevel = 1;
// Accept the inserted data in the Subscriber's data set and
// apply it to the Publisher.
return ActionOnDataChange.AcceptData;
}
else
{
return base.InsertHandler(insertSource, insertedDataSet, ref customDataSet,
ref historyLogLevel, ref historyLogMessage);
}
}
public override ActionOnDataChange UpdateHandler(SourceIdentifier updateSource,
DataSet updatedDataSet, ref DataSet customDataSet, ref int historyLogLevel,
ref string historyLogMessage)
{
if (updateSource == SourceIdentifier.SourceIsPublisher)
{
// Build a line item in the audit message to log the Subscriber update.
StringBuilder AuditMessage = new StringBuilder();
AuditMessage.Append(String.Format("An existing order was updated at {0}. " +
"The SalesOrderID for the order is ", subscriberName));
AuditMessage.Append(updatedDataSet.Tables[0].Rows[0]["SalesOrderID"].ToString());
AuditMessage.Append("The order must now be shipped by :");
AuditMessage.Append(updatedDataSet.Tables[0].Rows[0]["DueDate"].ToString());
// Set the reference parameter to write the line to the log file.
historyLogMessage = AuditMessage.ToString();
// Set the history log level to the default verbose level.
historyLogLevel = 1;
// Accept the updated data in the Subscriber's data set and apply it to the Publisher.
return ActionOnDataChange.AcceptData;
}
else
{
return base.UpdateHandler(updateSource, updatedDataSet,
ref customDataSet, ref historyLogLevel, ref historyLogMessage);
}
}
public override ActionOnDataDelete DeleteHandler(SourceIdentifier deleteSource,
DataSet deletedDataSet, ref int historyLogLevel, ref string historyLogMessage)
{
if (deleteSource == SourceIdentifier.SourceIsSubscriber)
{
// Build a line item in the audit message to log the Subscriber deletes.
// Note that the rowguid is the only information that is
// available in the dataset.
StringBuilder AuditMessage = new StringBuilder();
AuditMessage.Append(String.Format("An existing order was deleted at {0}. " +
"The rowguid for the order is ", subscriberName));
AuditMessage.Append(deletedDataSet.Tables[0].Rows[0]["rowguid"].ToString());
// Set the reference parameter to write the line to the log file.
historyLogMessage = AuditMessage.ToString();
// Set the history log level to the default verbose level.
historyLogLevel = 1;
// Accept the delete and apply it to the Publisher.
return ActionOnDataDelete.AcceptDelete;
}
else
{
return base.DeleteHandler(deleteSource, deletedDataSet,
ref historyLogLevel, ref historyLogMessage);
}
}
}
}
Imports System
Imports System.Text
Imports System.Data
Imports System.Data.Common
Imports Microsoft.SqlServer.Replication.BusinessLogicSupport
Namespace Microsoft.Samples.SqlServer.BusinessLogicHandler
Public Class OrderEntryBusinessLogicHandler
Inherits BusinessLogicModule
' Variables to hold server names.
Private publisherName As String
Private subscriberName As String
' Implement the Initialize method to get publication
' and subscription information.
Public Overrides Sub Initialize( _
ByVal publisher As String, _
ByVal subscriber As String, _
ByVal distributor As String, _
ByVal publisherDB As String, _
ByVal subscriberDB As String, _
ByVal articleName As String _
)
' Set the Publisher and Subscriber names.
publisherName = publisher
subscriberName = subscriber
End Sub
' Declare what types of row changes, conflicts, or errors to handle.
Public Overrides ReadOnly Property HandledChangeStates() As ChangeStates
Get
' Handle Subscriber inserts, updates and deletes.
Return (ChangeStates.SubscriberInserts Or _
ChangeStates.SubscriberUpdates Or ChangeStates.SubscriberDeletes)
End Get
End Property
Public Overrides Function InsertHandler(ByVal insertSource As SourceIdentifier, _
ByVal insertedDataSet As DataSet, ByRef customDataSet As DataSet, _
ByRef historyLogLevel As Integer, ByRef historyLogMessage As String) _
As ActionOnDataChange
If insertSource = SourceIdentifier.SourceIsSubscriber Then
' Build a line item in the audit message to log the Subscriber insert.
Dim AuditMessage As StringBuilder = New StringBuilder()
AuditMessage.Append(String.Format("A new order was entered at {0}. " + _
"The SalesOrderID for the order is :", subscriberName))
AuditMessage.Append(insertedDataSet.Tables(0).Rows(0)("SalesOrderID").ToString())
AuditMessage.Append("The order must be shipped by :")
AuditMessage.Append(insertedDataSet.Tables(0).Rows(0)("DueDate").ToString())
' Set the reference parameter to write the line to the log file.
historyLogMessage = AuditMessage.ToString()
' Set the history log level to the default verbose level.
historyLogLevel = 1
' Accept the inserted data in the Subscriber's data set and
' apply it to the Publisher.
Return ActionOnDataChange.AcceptData
Else
Return MyBase.InsertHandler(insertSource, insertedDataSet, customDataSet, _
historyLogLevel, historyLogMessage)
End If
End Function
Public Overrides Function UpdateHandler(ByVal updateSource As SourceIdentifier, _
ByVal updatedDataSet As DataSet, ByRef customDataSet As DataSet, _
ByRef historyLogLevel As Integer, ByRef historyLogMessage As String) _
As ActionOnDataChange
If updateSource = SourceIdentifier.SourceIsPublisher Then
' Build a line item in the audit message to log the Subscriber update.
Dim AuditMessage As StringBuilder = New StringBuilder()
AuditMessage.Append(String.Format("An existing order was updated at {0}. " + _
"The SalesOrderID for the order is ", subscriberName))
AuditMessage.Append(updatedDataSet.Tables(0).Rows(0)("SalesOrderID").ToString())
AuditMessage.Append("The order must now be shipped by :")
AuditMessage.Append(updatedDataSet.Tables(0).Rows(0)("DueDate").ToString())
' Set the reference parameter to write the line to the log file.
historyLogMessage = AuditMessage.ToString()
' Set the history log level to the default verbose level.
historyLogLevel = 1
' Accept the updated data in the Subscriber's data set and apply it to the Publisher.
Return ActionOnDataChange.AcceptData
Else
Return MyBase.UpdateHandler(updateSource, updatedDataSet, _
customDataSet, historyLogLevel, historyLogMessage)
End If
End Function
Public Overrides Function DeleteHandler(ByVal deleteSource As SourceIdentifier, _
ByVal deletedDataSet As DataSet, ByRef historyLogLevel As Integer, _
ByRef historyLogMessage As String) As ActionOnDataDelete
If deleteSource = SourceIdentifier.SourceIsSubscriber Then
' Build a line item in the audit message to log the Subscriber deletes.
' Note that the rowguid is the only information that is
' available in the dataset.
Dim AuditMessage As StringBuilder = New StringBuilder()
AuditMessage.Append(String.Format("An existing order was deleted at {0}. " + _
"The rowguid for the order is ", subscriberName))
AuditMessage.Append(deletedDataSet.Tables(0).Rows(0)("rowguid").ToString())
' Set the reference parameter to write the line to the log file.
historyLogMessage = AuditMessage.ToString()
' Set the history log level to the default verbose level.
historyLogLevel = 1
' Accept the delete and apply it to the Publisher.
Return ActionOnDataDelete.AcceptDelete
Else
Return MyBase.DeleteHandler(deleteSource, deletedDataSet, _
historyLogLevel, historyLogMessage)
End If
End Function
End Class
End Namespace
Poniższy przykład rejestruje obsługa logika biznesowa zestaw u dystrybutora i zmiany istniejących seryjnej artykuł do używania tej niestandardowe logika biznesowa.
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @friendlyname AS sysname;
DECLARE @assembly AS nvarchar(500);
DECLARE @class AS sysname;
SET @publication = N'AdvWorksCustomers';
SET @article = N'Customers';
SET @friendlyname = N'OrderEntryLogic';
SET @assembly = N'C:\Program Files\Microsoft SQL Server\100\COM\CustomLogic.dll';
SET @class = N'Microsoft.Samples.SqlServer.BusinessLogicHandler.OrderEntryBusinessLogicHandler';
-- Register the business logic handler at the Distributor.
EXEC sys.sp_registercustomresolver
@article_resolver = @friendlyname,
@resolver_clsid = NULL,
@is_dotnet_assembly = N'true',
@dotnet_assembly_name = @assembly,
@dotnet_class_name = @class;
-- Add an article that uses the business logic handler
-- at the Publisher.
EXEC sp_changemergearticle
@publication = @publication,
@article = @article,
@property = N'article_resolver',
@value = @friendlyname,
@force_invalidate_snapshot = 0,
@force_reinit_subscription = 0;
GO
Zobacz także