2012-07-11 7 views
0

Мне нужно экспортировать данные с SQL Server при обновлении определенного столбца и задаться вопросом, есть ли какой-нибудь рекомендуемый способ сделать это?Экспорт данных из SQL Server при обновлении

У меня есть таблица со столбцом «Активирована», когда это значение изменено на true, экспорт должен быть запущен.

Я полагаю, что мне нужен триггер, который реагирует на изменения в «Активированном». И мои два варианта в настоящее время - вызвать веб-сервис непосредственно из триггера или позволить триггеру вставлять данные в таблицу, которую моя одна служба считывает и вызывает внешнюю службу. Является ли какая-либо из этих идей предпочтительной или есть другое лучшее решение?

+0

Вы не должны делать что-нибудь * * в качестве триггера, который зависит от любые ресурсы, внешние по отношению к базе данных. Вы предположительно * не хотели бы, чтобы обновление должно было ждать 5 минут или сбой, если есть проблемы с веб-службой? –

ответ

2

вы должны проверить брокер службы SQL Server - его можно использовать для инициирования внешних действий при внесении изменений в данные.

одна реализация (который я не использовал) можно найти здесь: http://lab.arc90.com/2009/02/05/sqlwatcher-ad-hoc-database-change-monitoring/

+0

Service Broker был тем, что мне было нужно, SQLWatcher кажется приятным для мониторинга базы данных, но не соответствует моим потребностям на этот раз – user613068

0

Если у вас есть нечастые изменения в данных (например, классифицируемые значения), вы можете использовать Query Notifications + SQLDependencies класс. Behindd сцены также использует Service Broker @paul.

Например, вы можете иметь таблицу:

CREATE TABLE dbo.MyTable 
(
    MyTableID INT not null PRIMARY KEY IDENTITY, 
    SomeText nvarchar(50) 
) 

И SQL код (пользовательские права обсуждаются here):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.SqlClient; 

namespace TestApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SqlDependency.Start("server=<MyServer>;database=<MyDB>;User ID=<user>;Password=<pwd>;Integrated Security=false;"); 
      Console.WriteLine("Started.."); 
      get_msg(); 
      Console.ReadLine(); 
      SqlDependency.Stop("server=<MyServer>;database=<MyDB>;User ID=<user>;Password=<pwd>;Integrated Security=false;"); 
     } 
     private static void get_msg() 
     { 
      using (SqlConnection con = 
          new SqlConnection("server=<MyServer>;database=<MyDB>;User ID=<user>;Password=<pwd>;Integrated Security=false;")) 
      { 
       SqlCommand com = new SqlCommand("SELECT MyTableID, SomeText FROM dbo.MyTable ", con); 
       SqlDependency dependency = new SqlDependency(com); 
       dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 
       con.Open(); 
       com.ExecuteNonQuery(); 
      } 
     } 
     static void dependency_OnChange(object sender, SqlNotificationEventArgs e) 
     { 
      Console.WriteLine("dependency Info = {0}, time: {1}",e.Info, DateTime.Now); 
      get_msg(); 
     } 
    } 
} 
Смежные вопросы