У меня есть две разные базы данных, один из которых подключен от файла .MDF
к серверу .\SQLEXPRESS
. Мастер-сервер работает на сервере на другом компьютере под названием COMPUTER_NAME
.Как объединить две базы данных на двух разных серверах?
Я хочу объединить их с помощью C# для запуска файла .SQL
. Я вставить свой код ниже для справки, но в основном моя проблема заключается в том, что если я подключиться к серверу с помощью
string sqlConnectionString = @"Server=.\SQLEXPRESS; Trusted_Connection=True";
Тогда я не могу найти базу данных на COMPUTER_NAME
. И если я использую
string sqlConnectionString = @"Server=COMPUTER_NAME; Trusted_Connection=True";
Это будет выглядеть мой .MDF
файл на C: привод COMPUTER_NAME
, а не на локальной машине.
Как подключиться к обеим этим базам данных на разных серверах?
Дополнительная информация:
SQL-скрипт я использую. Это отлично отработало, когда обе базы данных были на одном сервере, но я больше не могу этого делать.
CREATE DATABASE ClientDB
ON (Filename = 'C:\Clayton.mdf')
, (Filename = 'C:\Clayton_log.ldf')
FOR ATTACH;
-- update the client from the master
MERGE [ClientDB].[dbo].[table] trgt
using [MasterDB].[dbo].[table] src
ON trgt.id = src.id
WHEN matched AND trgt.lastmodified <= src.lastmodified THEN -- if master row is newer
UPDATE SET trgt.[info] = src.[info], ... -- update the client
WHEN NOT matched BY source -- delete rows added by client
THEN DELETE
WHEN NOT matched BY target -- insert rows added by master
THEN INSERT ([info], ...) VALUES (src.[info], ...);
-- close all connections to database
ALTER DATABASE ClientDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- detach database
EXEC sp_detach_db 'ClientDB', 'true';
И я бегу это с помощью C#, как так:
string sqlConnectionString = @"Server=.\SQLEXPRESS; Trusted_Connection=True";
string script = File.ReadAllText(Environment.CurrentDirectory + @"\MergeTotal.sql");
SqlConnection conn = new SqlConnection(sqlConnectionString);
IEnumerable<string> commandStrings = Regex.Split(script, @"^\s*GO\s*$",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
conn.Open();
foreach (string commandString in commandStrings)
{
if (commandString.Trim() != "")
{
using (var command = new SqlCommand(commandString, conn))
{
command.ExecuteNonQuery();
}
}
}
Я не волнует, если весь процесс происходит в .SQL
или в C#
так долго, как это имеет желаемый эффект.
Заранее благодарим за любые рекомендации или рекомендации.
Как часто вам нужно запустить это? –
Часто я боюсь. Сейчас он настроен так, что каждый раз, когда запускается программа, он проверяет, подключен ли он к сети с основной базой данных и будет сливаться, если это так. –
Возможно, вам придется рассмотреть редизайн того, как он работает, так как вы не можете так слиться. Вероятно, вы должны отслеживать изменения, а затем повторно использовать их на главном сервере. –