Kommentar
Å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
Detta ämne beskriver hur man definierar en logisk postrelation mellan sammanslagningstabellsartiklar i SQL Server genom att använda SQL Server Management Studio, Transact-SQL eller Replication Management Objects (RMO).
Sammanslagen replikering låter dig definiera en relation mellan relaterade rader i olika tabeller. Dessa rader kan sedan bearbetas som en transaktionsenhet under synkroniseringen. En logisk post kan definieras mellan två artiklar oavsett om de har en join-filterrelation eller inte. Mer information finns i Gruppera ändringar i relaterade rader med logiska poster.
Anmärkning
Den här funktionen tas bort i en framtida version av SQL Server. Undvik att använda den här funktionen i nytt utvecklingsarbete och planera att ändra program som för närvarande använder den här funktionen.
Begränsningar och restriktioner
- Om du lägger till, ändrar eller tar bort en logisk post efter att prenumerationerna på publikationen har initierats, måste du generera en ny snapshot och återinitiera alla prenumerationer efter att ha gjort ändringen. Mer information om kraven för ändringar av egenskaper finns i Ändra egenskaper för publikation och artikel.
Använda SQL Server Management Studio
Definiera logiska poster i dialogrutan Lägg till anslut , som finns i New Publication Wizard och i dialogrutan Publication Properties - <Publication> . Mer information om hur du använder guiden och hur du öppnar dialogrutan finns i Skapa en publikation och visa och ändra publikationsegenskaper.
Logiska poster kan definieras i dialogrutan Add Join endast om de tillämpas på ett join-filter i en merge-publikation, och publiceringen följer kraven för att använda förberäknade partitioner. För att definiera logiska poster som inte används för join-filter och för att ställa in konfliktupptäckt och lösning på logisk postnivå, måste du använda lagrade procedurer.
Definiera en relation mellan logiska poster
På sidan Filter Table Rows i New Publication Wizard eller på sidan Filter Rows i dialogrutan Publication Properties - <Publication> , välj ett radfilter i panelen Filtrerade tabeller .
En relation mellan logiska poster associeras med ett sammanfogningsfilter, som utökar ett radfilter. Därför måste du definiera ett radfilter innan du kan utöka filtret med en sammanfogning och tillämpa en logisk relation mellan poster. Efter att ett join-filter har definierats kan du utöka detta join-filter med ett annat join-filter. För mer information om att definiera joinfilter, se Definiera och modifiera ett joinfilter mellan sammanslagningsartiklar.
Klicka på Lägg till, och sedan klicka på Lägg till Join för att utöka det valda filtret.
Definiera ett join-filter i dialogrutan Lägg till join och välj sedan kryssrutan Logical Record.
Om du är i dialogrutan Publikationsegenskaper – <publikation> klickar du på OK för att spara och stänga dialogrutan.
Ta bort en relation mellan logiska poster
Ta bort endast den logiska postrelationen eller ta bort den logiska postrelationen och anslutningsfiltret som är kopplat till den.
Om du bara vill ta bort den logiska relationen mellan posterna:
På sidan Filter Rows i guiden Ny publikation eller på sidan Filter Rows i dialogrutan Publication Properties - <Publication> väljer du det kopplingsfilter som är associerat med den logiska postrelationen i fönstret Filtrerade tabeller och klickar sedan på Redigera.
I dialogrutan Redigera anslut , rensa kryssrutan Logisk post.
Välj OK.
För att ta bort den logiska postrelationen och anslutningsfiltret som är kopplat till den:
- På sidan Filter Rader i Ny publiceringsguide eller dialogrutan Publikationsegenskaper - <Publikation> , välj ett filter i panelen Filtrerade tabeller och klicka sedan på Radera. Om det kopplingsfilter du tar bort i sin tur utökas av andra kopplingar, kommer även dessa kopplingar att tas bort.
Använda Transact-SQL
Du kan programmatiskt specificera logiska postrelationer mellan artiklar med hjälp av replikationslagrade procedurer.
För att definiera en relation mellan logiska poster utan något associerat kopplingsfilter
Om publikationen innehåller några filtrerade artiklar, kör sp_helpmergepublication och notera värdet av use_partition_groups i resultatuppsättningen.
Om värdet är 1 används redan förberäknade partitioner.
Om värdet är 0, kör sp_changemergepublication vid Publisher i publiceringsdatabasen. Ange värdet use_partition_groups för @property och värdet true för @value.
Anmärkning
Om publikationen inte stödjer förberäknade partitioner kan logiska poster inte användas. För mer information, se Krav för användning av förberäknade partitioner i ämnet Optimera parameteriserad filterprestanda med förberäknade partitioner.
Om värdet är NULL måste Snapshot Agent köras för att generera den initiala snapshoten för publiceringen.
Om de artiklar som ska utgöra den logiska raden inte finns, kör sp_addmergearticle hos utgivaren i publikationsdatabasen. Ange ett av följande alternativ för konfliktidentifiering och konfliktlösning för den logiska posten:
För att upptäcka och lösa konflikter som uppstår inom relaterade rader i den logiska posten anger du true som värde för @logical_record_level_conflict_detection och @logical_record_level_conflict_resolution.
För att använda standardkonfliktdetektering och lösning på rad- eller kolumnnivå, ange ett falskt värde för@logical_record_level_conflict_detection och @logical_record_level_conflict_resolution, vilket är standard.
Upprepa steg 2 för varje artikel som ska ingå i den logiska posten. Du måste använda samma konfliktdetekterings- och lösningsalternativ för varje artikel i den logiska posten. Mer information finns i Identifiera och lösa konflikter i logiska poster.
Hos förlaget i publikationsdatabasen, kör sp_addmergefilter. Specificera @publication, namnet på en artikel i relationen för @article, namnet på den andra artikeln för @join_articlename, ett namn på relationen för @filtername, en klausul som definierar relationen mellan de två artiklarna för @join_filterclause, typen av sammanfogning för @join_unique_key och ett av följande värden för @filter_type:
2 - Definierar en logisk relation.
3 - Definierar en logisk relation med ett joinfilter.
Anmärkning
Om ett join-filter inte används är riktningen på relationen mellan de två artiklarna inte viktig.
Upprepa steg 2 för varje återstående relation mellan logiska poster i publikationen.
Så här ändrar du konfliktupptäckt och konfliktlösning för logiska poster
För att upptäcka och lösa konflikter som uppstår inom relaterade rader i den logiska posten:
Kör sp_changemergearticle på Publisher i publikationsdatabasen. Ange ett värde av logical_record_level_conflict_detection för @property och ett värde av true för @value. Ange värdet 1 för @force_invalidate_snapshot och @force_reinit_subscription.
Kör sp_changemergearticle på Publisher i publikationsdatabasen. Ange värdet logical_record_level_conflict_resolution för @property och värdet true för @value. Ange värdet 1 för @force_invalidate_snapshot och @force_reinit_subscription.
För att använda standardkonfliktdetektering och lösning på rad- eller kolumnnivå:
Kör sp_changemergearticle på Publisher i publikationsdatabasen. Ange värdet logical_record_level_conflict_detection för @property och värdet false för @value. Ange värdet 1 för @force_invalidate_snapshot och @force_reinit_subscription.
Kör sp_changemergearticle på Publisher i publikationsdatabasen. Ange värdet logical_record_level_conflict_resolution för @property och värdet false för @value. Ange värdet 1 för @force_invalidate_snapshot och @force_reinit_subscription.
Ta bort en relation mellan logiska poster
På Publisher i publikationsdatabasen utför du följande fråga för att returnera information om alla logiska postrelationer definierade för den angivna publikationen:
SELECT f.* FROM sysmergesubsetfilters AS f INNER JOIN sysmergepublications AS p ON f.pubid = p.pubid WHERE p.[name] = @publication;Notera namnet på den logiska postrelationen som tas bort i filtername-kolumnen i resultatuppsättningen.
Anmärkning
Denna fråga returnerar samma information som sp_helpmergefilter; denna systemlagrade procedur returnerar dock endast information om logiska postrelationer som också är join-filter.
Vid Publisher i publikationsdatabasen, kör sp_dropmergefilter. Specificera @publication, namnet på en av artiklarna i relationen för @article, och namnet på relationen från steg 1 för @filtername.
Exempel (Transact-SQL)
Detta exempel möjliggör förberäknade partitioner på en befintlig publikation och skapar en logisk post bestående av de två nya artiklarna för SalesOrderHeader och SalesOrderDetail tabellerna.
-- Remove ON DELETE CASCADE from FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID;
-- logical records cannot be used with ON DELETE CASCADE.
IF EXISTS (SELECT * FROM sys.objects
WHERE name = 'FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID')
BEGIN
ALTER TABLE [Sales].[SalesOrderDetail]
DROP CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID]
END
ALTER TABLE [Sales].[SalesOrderDetail]
WITH CHECK ADD CONSTRAINT [FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID]
FOREIGN KEY([SalesOrderID])
REFERENCES [Sales].[SalesOrderHeader] ([SalesOrderID])
GO
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @table3 AS sysname;
DECLARE @salesschema AS sysname;
DECLARE @hrschema AS sysname;
DECLARE @filterclause AS nvarchar(1000);
DECLARE @partitionoption AS bit;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @table1 = N'SalesOrderDetail';
SET @table2 = N'SalesOrderHeader';
SET @salesschema = N'Sales';
SET @hrschema = N'HumanResources';
SET @filterclause = N'Employee.LoginID = HOST_NAME()';
-- Ensure that the publication uses precomputed partitions.
SET @partitionoption = (SELECT [use_partition_groups] FROM sysmergepublications
WHERE [name] = @publication);
IF @partitionoption <> 1
BEGIN
EXEC sp_changemergepublication
@publication = @publication,
@property = N'use_partition_groups',
@value = 'true',
@force_invalidate_snapshot = 1;
END
-- Add a filtered article for the Employee table.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_object = @table1,
@type = N'table',
@source_owner = @hrschema,
@schema_option = 0x0004CF1,
@description = N'article for the Employee table',
@subset_filterclause = @filterclause;
-- Add an article for the SalesOrderHeader table.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_object = @table2,
@type = N'table',
@source_owner = @salesschema,
@schema_option = 0x0034EF1,
@description = N'article for the SalesOrderHeader table';
-- Add an article for the SalesOrderDetail table.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table3,
@source_object = @table3,
@source_owner = @salesschema,
@description = 'article for the SalesOrderDetail table',
@identityrangemanagementoption = N'auto',
@pub_identity_range = 100000,
@identity_range = 100,
@threshold = 80;
-- Add a merge join filter between Employee and SalesOrderHeader.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table2,
@filtername = N'SalesOrderHeader_Employee',
@join_articlename = @table1,
@join_filterclause = N'Employee.EmployeeID = SalesOrderHeader.SalesPersonID',
@join_unique_key = 1,
@filter_type = 1,
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1;
-- Create a logical record relationship that is also a merge join
-- filter between SalesOrderHeader and SalesOrderDetail.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table3,
@filtername = N'LogicalRecord_SalesOrderHeader_SalesOrderDetail',
@join_articlename = @table2,
@join_filterclause = N'[SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]',
@join_unique_key = 1,
@filter_type = 3,
@force_invalidate_snapshot = 1,
@force_reinit_subscription = 1;
GO
Använda replikeringshanteringsobjekt (RMO)
Anmärkning
Sammanslagningsreplikering gör det möjligt att ange att konflikter ska spåras och lösas på nivån för logiska poster, men dessa alternativ kan inte ställas in med hjälp av RMO.
För att definiera en relation mellan logiska poster utan något associerat kopplingsfilter
Skapa en anslutning till Publisher med hjälp av klassen ServerConnection.
Skapa en instans av klassen MergePublication, ange egenskaperna DatabaseName och Name för publikationen och ange egenskapen ConnectionContext till den anslutning som skapades i steg 1.
Anropa metoden LoadProperties för att hämta objektets egenskaper. Om den här metoden returnerar falsehar publikationsegenskaperna i steg 2 definierats felaktigt eller så finns publikationen inte.
Om egenskapen PartitionGroupsOption är satt till False, sätt den till .True
Om artiklarna som ska utgöra den logiska posten inte finns, skapa en instans av MergeArticle klassen och ange följande egenskaper:
Namnet på artikeln för Name.
Namnet på publikationen för PublicationName.
(Valfritt) Om artikeln är horisontellt filtrerad, ange radfilterklausulen för egenskapen FilterClause . Använd denna egenskap för att specificera ett statiskt eller parameteriserat radfilter. Mer information finns i Parameteriserade radfilter.
Mer information finns i Definiera en artikel.
Anropa Create metoden.
Upprepa steg 5 och 6 för varje artikel som ingår i den logiska posten.
Skapa en instans av klassen MergeJoinFilter för att definiera den logiska postrelationen mellan artiklar. Sätt sedan följande egenskaper:
Namnet på den underordnade artikeln i den logiska postrelationen för egenskapen ArticleName.
Namnet på den befintliga, överordnade artikeln i den logiska postrelationen för egenskapen JoinArticleName.
Ett namn på den logiska relationen mellan poster för egenskapen FilterName.
Uttrycket som definierar relationen för egenskapen JoinFilterClause .
Ett värde på LogicalRecordLink för egenskapen FilterTypes. Om den logiska postrelationen också är ett joinfilter, ange ett värde av JoinFilterAndLogicalRecordLink för denna egenskap. Mer information finns i Gruppera ändringar i relaterade rader med logiska poster.
Anropa metoden AddMergeJoinFilter på objektet som representerar den underordnade artikeln i relationen. Skicka objektet MergeJoinFilter från steg 8 för att definiera relationen.
Upprepa steg 8 och 9 för varje återstående logisk relation mellan poster i publikationen.
Exempel (RMO)
Detta exempel skapar en logisk post som består av de två nya artiklarna för SalesOrderHeader och SalesOrderDetail tabellerna.
// Define the Publisher and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
// Specify article names.
string articleName1 = "SalesOrderHeader";
string articleName2 = "SalesOrderDetail";
// Specify logical record information.
string lrName = "SalesOrderHeader_SalesOrderDetail";
string lrClause = "[SalesOrderHeader].[SalesOrderID] = "
+ "[SalesOrderDetail].[SalesOrderID]";
string schema = "Sales";
MergeArticle article1 = new MergeArticle();
MergeArticle article2 = new MergeArticle();
MergeJoinFilter lr = new MergeJoinFilter();
MergePublication publication = new MergePublication();
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Verify that the publication uses precomputed partitions.
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = conn;
// If we can't get the properties for this merge publication, then throw an application exception.
if (publication.LoadProperties())
{
// If precomputed partitions is disabled, enable it.
if (publication.PartitionGroupsOption == PartitionGroupsOption.False)
{
publication.PartitionGroupsOption = PartitionGroupsOption.True;
}
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication. " +
"Ensure that the publication {0} exists on {1}.",
publicationName, publisherName));
}
// Set the required properties for the PurchaseOrderHeader article.
article1.ConnectionContext = conn;
article1.Name = articleName1;
article1.DatabaseName = publicationDbName;
article1.SourceObjectName = articleName1;
article1.SourceObjectOwner = schema;
article1.PublicationName = publicationName;
article1.Type = ArticleOptions.TableBased;
// Set the required properties for the SalesOrderDetail article.
article2.ConnectionContext = conn;
article2.Name = articleName2;
article2.DatabaseName = publicationDbName;
article2.SourceObjectName = articleName2;
article2.SourceObjectOwner = schema;
article2.PublicationName = publicationName;
article2.Type = ArticleOptions.TableBased;
if (!article1.IsExistingObject) article1.Create();
if (!article2.IsExistingObject) article2.Create();
// Define a logical record relationship between
// PurchaseOrderHeader and PurchaseOrderDetail.
// Parent article.
lr.JoinArticleName = articleName1;
// Child article.
lr.ArticleName = articleName2;
lr.FilterName = lrName;
lr.JoinUniqueKey = true;
lr.FilterTypes = FilterTypes.LogicalRecordLink;
lr.JoinFilterClause = lrClause;
// Add the logical record definition to the parent article.
article1.AddMergeJoinFilter(lr);
}
catch (Exception ex)
{
// Do error handling here and rollback the transaction.
throw new ApplicationException(
"The filtered articles could not be created", ex);
}
finally
{
conn.Disconnect();
}
' Define the Publisher and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
' Specify article names.
Dim articleName1 As String = "SalesOrderHeader"
Dim articleName2 As String = "SalesOrderDetail"
' Specify logical record information.
Dim lrName As String = "SalesOrderHeader_SalesOrderDetail"
Dim lrClause As String = "[SalesOrderHeader].[SalesOrderID] = " _
& "[SalesOrderDetail].[SalesOrderID]"
Dim schema As String = "Sales"
Dim article1 As MergeArticle = New MergeArticle()
Dim article2 As MergeArticle = New MergeArticle()
Dim lr As MergeJoinFilter = New MergeJoinFilter()
Dim publication As MergePublication = New MergePublication()
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Verify that the publication uses precomputed partitions.
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = conn
' If we can't get the properties for this merge publication, then throw an application exception.
If publication.LoadProperties() Then
' If precomputed partitions is disabled, enable it.
If publication.PartitionGroupsOption = PartitionGroupsOption.False Then
publication.PartitionGroupsOption = PartitionGroupsOption.True
End If
Else
Throw New ApplicationException(String.Format( _
"Settings could not be retrieved for the publication. " _
& "Ensure that the publication {0} exists on {1}.", _
publicationName, publisherName))
End If
' Set the required properties for the SalesOrderHeader article.
article1.ConnectionContext = conn
article1.Name = articleName1
article1.DatabaseName = publicationDbName
article1.SourceObjectName = articleName1
article1.SourceObjectOwner = schema
article1.PublicationName = publicationName
article1.Type = ArticleOptions.TableBased
' Set the required properties for the SalesOrderDetail article.
article2.ConnectionContext = conn
article2.Name = articleName2
article2.DatabaseName = publicationDbName
article2.SourceObjectName = articleName2
article2.SourceObjectOwner = schema
article2.PublicationName = publicationName
article2.Type = ArticleOptions.TableBased
If Not article1.IsExistingObject Then
article1.Create()
End If
If Not article2.IsExistingObject Then
article2.Create()
End If
' Define a logical record relationship between
' SalesOrderHeader and SalesOrderDetail.
' Parent article.
lr.JoinArticleName = articleName1
' Child article.
lr.ArticleName = articleName2
lr.FilterName = lrName
lr.JoinUniqueKey = True
lr.FilterTypes = FilterTypes.LogicalRecordLink
lr.JoinFilterClause = lrClause
' Add the logical record definition to the parent article.
article1.AddMergeJoinFilter(lr)
Catch ex As Exception
' Do error handling here and rollback the transaction.
Throw New ApplicationException( _
"The filtered articles could not be created", ex)
Finally
conn.Disconnect()
End Try
Relaterat innehåll
- Definiera och ändra ett kopplingsfilter mellan sammanslagningsartiklar
- Definiera och ändra ett parameteriserat radfilter för en sammanslagningsartikel
- Definiera och ändra ett statiskt radfilter
- Gruppering av ändringar i relaterade rader med logiska register
- Parameteriserade filter – Optimera för förberäknade partitioner