Является ли ссылочная целостность между таблицами обязательной для пользовательского средства разрешения конфликтов в репликации слиянием SQL?
У меня есть база данных, которая имеет несколько таблиц, но эти таблицы не имеют никакого отношения определения (ссылочная целостность) в базе данных. Они связаны друг с другом, но поддерживаются триггером и приложением. Я создал настраиваемый механизм разрешения конфликтов на репликации слиянием Microsoft SQL Server 2008 R2. В настраиваемом средстве разрешения конфликтов я проверяю приоритет подписчиков по SQL-запросу из базы данных издателя и основываясь на этом приоритете. Я разрешаю конфликт в таблице данных репликации.
Пользовательский код разрешения конфликтов, как показано ниже
public override ActionOnUpdateConflict UpdateConflictsHandler(DataSet publisherDataSet, DataSet subscriberDataSet, ref DataSet customDataSet,
ref ConflictLogType conflictLogType, ref string customConflictMessage, ref int historyLogLevel, ref string historyLogMessage)
{
// Priority column AcceptDate
DateTime? publisherModifiedDate = string.IsNullOrWhiteSpace(Convert.ToString(publisherDataSet.Tables[0].Rows[0]["AcceptDate"])) ? new Nullable<DateTime>() : DateTime.Parse(publisherDataSet.Tables[0].Rows[0]["AcceptDate"].ToString());
DateTime? subscriberModifiedDate = string.IsNullOrWhiteSpace(Convert.ToString(subscriberDataSet.Tables[0].Rows[0]["AcceptDate"])) ? new Nullable<DateTime>() : DateTime.Parse(subscriberDataSet.Tables[0].Rows[0]["AcceptDate"].ToString());
//Get priority via userid
int publisherUserId = Convert.ToInt32(publisherDataSet.Tables[0].Rows[0]["UserId"]);
int subcriberUserId = Convert.ToInt32(subscriberDataSet.Tables[0].Rows[0]["UserId"]);
DataTable dt = new DataTable();
//Publisher
using (SqlConnection sqlConnection = new SqlConnection(AppConfig.PubliosherConnectionString))
{
SqlCommand cmd = new SqlCommand("select * from RISubscriber where UserId=" + publisherUserId, sqlConnection);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
int publisherPriority = Convert.ToInt32(dt.Rows[0]["SubscriberPriority"]);
//Subcriber
dt = new DataTable();
using (SqlConnection sqlConnection = new SqlConnection(AppConfig.PubliosherConnectionString))
{
SqlCommand cmd = new SqlCommand("select * from RISubscriber where UserId=" + subcriberUserId, sqlConnection);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
int subcriberPriority = Convert.ToInt32(dt.Rows[0]["SubscriberPriority"]);
if (subcriberPriority > publisherPriority)
{
customDataSet = subscriberDataSet.Copy();
}
else
{
customDataSet = publisherDataSet.Copy();
}
return ActionOnUpdateConflict.AcceptCustomConflictData;
}
Вопрос: Я хочу реплицировать данные между подписчиками на основе пользовательского средства разрешения конфликтов и хочу поддерживать целостность данных между таблицами.
Пожалуйста, дайте мне знать. Если у вас есть идеи.
Как мы можем это сделать?
Спасибо