在更新时从SQL Server导出数据

时间:2012-07-11 10:59:03

标签: sql sql-server sql-server-2008 triggers

我需要在更新特定列时从SQL Server导出数据,并想知道是否有一些推荐的方法来执行此操作?

我有一个列为'Activated'的表,当此值更改为true时,应触发导出。

我说我需要一个触发器来响应'Activated'中的变化。目前我的两个选项是直接从触发器调用webservice,或者让触发器在我的一个服务读取的表中插入数据并调用extern服务。 这些想法是否更可取或是否还有其他更好的解决方案?

2 个答案:

答案 0 :(得分:2)

您应该检查SQL Server Service Broker - 它可以用于触发对数据更改的外部操作。

可以在此处找到一个实现(我没有使用过):http://lab.arc90.com/2009/02/05/sqlwatcher-ad-hoc-database-change-monitoring/

答案 1 :(得分:0)

如果您不经常更改数据(例如分类值),则可以使用Query Notifications + SQLDependencies类。在场景中它也使用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();
        }
    }
}
相关问题