2015-12-01 3 views
3

У меня есть система, которая передает данные между двумя базами данных с одинаковыми схемами (для целей разработки).Игнорировать триггеры при сборе зависимостей с SMO

Сходный хормейстер SMO отлично работает, за исключением триггеров. Если я получаю список зависимостей, мне все равно, если триггер вводит зависимость от другой таблицы, потому что триггер не будет выполняться во время передачи. Это особенно раздражает, если существуют круговые зависимости.

То, что я хотел бы знать, - это возможность игнорировать триггеры в шаге перехода на иждивении. Я пробовал несколько вещей, не повезло:

  • Не включая триггеры в списке объектов при звонке DiscoverDependencies. В любом случае, я включаю таблицы.
  • Использование FilterCallbackFunction на DependencyWalker. Это, кажется, ничего не делает.

Это код, у меня сейчас:

var tablesToLoad = scripter.WalkDependencies(new DependencyWalker(server).DiscoverDependencies(filteredTables, DependencyType.Parents)) 
          .Where(n => n.Urn.Type != "UnresolvedEntity") 
          .Select(n => server.GetSmoObject(n.Urn)) 
          .OfType<Table>() 
          .ToArray(); 

Переменная filteredTables содержит список таблиц, которые я хочу использовать для передачи данных. Результатом являются все таблицы в их зависимости, которые должны быть переданы, с зависимостями между включенными таблицами (включая другие таблицы, которые необходимо втянуть, чтобы не допустить смены внешних ключей).

EDIT: Я хочу повторить, что проблема заключается не в том, выполняются триггеры, либо нет. Проблема заключается в том, что SMO просматривает триггеры при определении порядка зависимостей для загрузки таблиц. Поэтому, если триггер ссылается на другую таблицу, независимо от того, будут ли операторы, которые ссылаются на эту таблицу, когда-либо выполняться в триггере, эта ссылка рассматривается для разрешения зависимостей. Я не хочу, чтобы триггеры использовались для разрешения зависимостей вообще. Как заставить SMO игнорировать триггеры, не отбрасывая их из базы данных? Это мой вопрос.

+0

Стол делает не существует в базе данных назначения? –

+0

Таблица существует. Я просто передаю данные. – siride

+0

просто идея, но как насчет переноса данных на промежуточный сервер базы данных, у которых есть только схема (и триггеры). После этого с этого промежуточного уровня отправьте на конечный сервер базы данных. –

ответ

1

Похоже, что единственный способ достичь этого - удалить триггеры, а затем снова добавить их после завершения хождения зависимостей.

Во-первых, получить список триггеров и падение их -

var triggers = database.Triggers; 
foreach (var trigger in triggers) 
{ 
    trigger.Drop(); 
} 

Построение дерева зависимостей -

var tablesToLoad = scripter.WalkDependencies(new DependencyWalker(server).DiscoverDependencies(filteredTables, DependencyType.Parents)) 
          .Where(n => n.Urn.Type != "UnresolvedEntity") 
          .Select(n => server.GetSmoObject(n.Urn)) 
          .OfType<Table>() 
          .ToArray(); 

Воссоздать спусковые -

foreach (var trigger in triggers) 
{ 
    trigger.Create(); 
} 
+0

Это то, что у меня есть сейчас. Я надеялся избежать, но если SMO ​​недостаточно гибкий, то, полагаю, мне придется придерживаться этого. – siride

+0

Я знаю, что это уродливо, но сейчас я не вижу другого пути. Если это правильное решение, я бы предложил ответить на ваш собственный вопрос и отметить его завершение, чтобы другие участники сообщества извлекли выгоду из ваших результатов. Я отвечу на ваш ответ. – Randy

+0

ваш ответ в основном имеет то, что я сделал, поэтому я позволю вам получить интернет-очки. Спасибо за попытку в любом случае. – siride

1

Вы можете создать 2 хранимые процедуры SQL Server, один для отключения, а другой для включения триггеров. Перед загрузкой таблиц вызовите запрещенную хранимую процедуру триггера, используя класс SqlCommand, и когда загрузка таблицы завершена, используйте SQLCommand для выполнения триггерной процедуры включения.

Надеюсь, это поможет!

+0

Я не думаю, что отключение триггеров остановит SMO от рассмотрения триггеров при определении порядка зависимостей. Мне все равно, выполняются триггеры или нет, но мне все равно, что таблицы загружены в правильном порядке, и я не могу получить этот заказ, если SMO ​​рассмотрит триггеры для порядка зависимостей. – siride

Смежные вопросы