none
SQL2005触发器如何实现同一个服务器实例内的两个数据库中表的同步? RRS feed

  • 问题

  • 本人平时接触的SQL并不深层,也就是常用的一些增删改查操作。
    目前需要使用触发器来同步“论坛数据库用户表”和“主站数据库用户表”个别字段的数据。
    两个数据库放置在同一个数据库实例内。请问该触发器需要如何编写,并且是简洁安全的?

    目前我遇到几个问题:
    1.使用一下方法建立的连接,作用范围有多大,它的生命周期有多长?是到主动删除它为止吗?
    exec   sp_addlinkedserver     'srv2','','SQLOLEDB','srv2的sql实例名或ip'
    exec   sp_addlinkedsrvlogin   'srv2','false',null,'用户名','密码'

    2.请看我的触发器代码,这是测试是否可以实现同步用的,不过无法实现。
    CREATE TRIGGER trigger_User_insert
    ON [dbo].[test_User']
    FOR INSERT AS
    BEGIN

    exec sp_configure 'show advanced options',1   reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1   reconfigure

    insert into openrowset('sqloledb','localhost';'dbUserName';'dbPassWord,'select UserName,UserPassword from testDB.dbo.test_User')
    select UserName,UserPassword from inserted

    exec sp_configure 'Ad Hoc Distributed Queries',0   reconfigure  
    exec sp_configure 'show advanced options',0   reconfigure
    END

    我的数据库连接是写在代码里的 
    没有写 exec sp_configure  的时候,提示需要 启用 'Ad Hoc Distributed Queries'。
    由于 启用 'Ad Hoc Distributed Queries' 不安全,所以想在触发器内启用,用完后关闭。
    可又提示 触发器内不允许使用 CONFIGURE 语句。
     请问这个问题需要怎么解决才安全有效?

    3.是不是关闭了递归就能避免两个数据表之间的触发器不进入死循环? 也就是A更改触发同步B,
    B更改了又会触发同步A。 或者只能在触发器内加判断了。

    请高手们指点迷津! 最好是能给出这个触发器的实现代码,或者范例,万分感谢!

     


    2011年9月15日 3:18

答案

  • 对于你的这个触发器应用,在同一实例里和在同一个数据库里 是一样得操作,用不着 用链接服务器。

    CREATE TRIGGER trigger_User_insert
    ON [dbo].[test_User']
    FOR INSERT AS
    BEGIN

    /*
    exec sp_configure 'show advanced options',1   reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1   reconfigure
    insert into openrowset('sqloledb','localhost';'dbUserName';'dbPassWord,'select UserName,UserPassword from  testDB.dbo.test_User')
    select UserName,UserPassword from inserted

    exec sp_configure 'Ad Hoc Distributed Queries',0   reconfigure  
    exec sp_configure 'show advanced options',0   reconfigure

    */

    insert into testDB.dbo.test_User (UserName,UserPassword )

    select UserName,UserPassword from inserted

    END

    2011年9月15日 3:52

全部回复



  • create trigger tr_insert_User on zj_User
    for insert
    as
    set xact_abort on
    insert zhujishi_web.dbo.zj_User(UserName,UserPassword) 
    select UserName,UserPassword from inserted

    已经实现了,同一服务器不需要填写数据库连接的~~  

    接下来就是一个防止死循环的问题了。

    2011年9月15日 3:44
  • 对于你的这个触发器应用,在同一实例里和在同一个数据库里 是一样得操作,用不着 用链接服务器。

    CREATE TRIGGER trigger_User_insert
    ON [dbo].[test_User']
    FOR INSERT AS
    BEGIN

    /*
    exec sp_configure 'show advanced options',1   reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1   reconfigure
    insert into openrowset('sqloledb','localhost';'dbUserName';'dbPassWord,'select UserName,UserPassword from  testDB.dbo.test_User')
    select UserName,UserPassword from inserted

    exec sp_configure 'Ad Hoc Distributed Queries',0   reconfigure  
    exec sp_configure 'show advanced options',0   reconfigure

    */

    insert into testDB.dbo.test_User (UserName,UserPassword )

    select UserName,UserPassword from inserted

    END

    2011年9月15日 3:52
  • 感谢楼上的回复,我也发现了,这就方便多了~~   前一次大概是我填错库名称了,报错了,以为不行。

    2011年9月15日 4:02