在一个数据库表中插入数据的时候,要在另一个数据库也保存同样的记录,这个触发器怎么写?

解决方案 »

  1.   

    设在db1的tb1上insert时,同时往db2的tb2进行insert. tb1,tb2结构相同.use db1
    go
    create trigger tb1_insert
    on tb1
    for insert
    as
      insert db2..tb2 select * from inserted --若表中含有标识列,那么请不要用select *,采用除标识列外的列名列表按顺序写出来.
    go
      

  2.   

    比如我在pc1的search库中tb1表中插数据 然后在pc2的search库中tb2表中同样也保存 这怎么写?库都是一样的,还有需要用户名和密码访问呢?
      

  3.   

    如果两个库不在同一个机器上,那么可以使用opendatasource或openrowset来连接.
    频繁使用的话,直接使用 sp_addlinkedserver来建立链接服务器.参见:http://topic.csdn.net/u/20071203/21/d3f4eac1-4241-44cf-9246-8938141094c9.html触发器里执行
    insert 链接服务器名.search.dbo.tb2 select * from inserted
      

  4.   

      insert   search..r_loudongxinxi   select   *   from   opendatasource(   
                        'sqloledb',   
                        'data   source=192.168.1.198;user   id=sa;password=123456'   
                        ).search.dbo.R_LouDongXinXi 
    链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的授权说明"。
    链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。
    消息 7399,级别 16,状态 1,过程 tb1_insert,第 7 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 报错。身份验证失败。
    消息 7303,级别 16,状态 1,过程 tb1_insert,第 7 行
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。
      

  5.   

    INSERT  OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source192.168.1.198;User ID=sa;Password=123456'
             ).search.dbo.R_LouDongXinXi  /*可以加成 (f1,f2,f3)*/
    SELECT * /*可以改成 f1,f2,f3*/
            FROM INSERTED设当前机器的数据库下的表上建立了触发器,触发器中执行以上的语句,
    那么,当对当前机器的这个表进行数据插入时,插入的数据同时被写到 192.168.1.198的 search库下的loudongxinxi表
      

  6.   

    恩 我就是想要这个,但是我这样写ALTER trigger [dbo].[tb1_insert]
    on [dbo].[R_LouDongXinXi]
    for insert
    as
    INSERT  OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source192.168.1.160;User ID=sa;Password=123456'
             ).search.dbo.R_LouDongXinXi 
    SELECT * FROM INSERTEDgo是这样的错误链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "无效的连接字符串属性"。
    消息 7303,级别 16,状态 1,过程 tb1_insert,第 6 行
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI" 的数据源对象。
      

  7.   

    报歉,手误,少打了一个=号.INSERT  OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source=192.168.1.198;User ID=sa;Password=123456'
             ).search.dbo.R_LouDongXinXi  /*可以加成 (f1,f2,f3)*/
    SELECT * /*可以改成 f1,f2,f3*/
            FROM INSERTED
      

  8.   

    [email protected] 我们的MSN 还能加下?还是不行麽
      

  9.   


    ALTER trigger [dbo].[tb1_insert]
    on [dbo].[R_LouDongXinXi]
    for insert
    asINSERT     OPENDATASOURCE( 
                      'SQLOLEDB', 
                      'Data   Source=192.168.1.160;User   ID=sa;Password=123456' 
                      ).search.dbo.R_LouDongXinXi     
    SELECT   *    FROM   INSERTED报错ALTER trigger [dbo].[tb1_insert]
    on [search].[dbo].[R_LouDongXinXi]
    for insert
    as
    EXEC sp_addlinkedserver 
       'zhangl', 
       '', 
       'MSDASQL',
       NULL,
       NULL,
       'DRIVER={SQL Server};SERVER=192.168.1.198;UID=sa;PWD=123456;'
    GO
    insert zhangl.search.dbo.R_LouDongXinXi
     select * from inserted
    [/code]
    还是报错 郁闷
      

  10.   

    我msn和qq都没上..第一种为什么犯错,我知道了.
    csdn乱加空格,害人啊.
    INSERT  OPENDATASOURCE(
             'SQLOLEDB',
             'Data Source=192.168.1.198;User ID=sa;Password=123456'
             ).search.dbo.R_LouDongXinXi  /*可以加成 (f1,f2,f3)*/
    SELECT * /*可以改成 f1,f2,f3*/
            FROM INSERTED
    --将上面的写法换为下面的:看它怎么加空格,呵呵
    INSERT  OPENDATASOURCE(
             'SQLOLEDB',
             'Server=192.168.1.198;UID=sa;Password=123456'
             ).search.dbo.R_LouDongXinXi  /*可以加成 (f1,f2,f3)*/
    SELECT * /*可以改成 f1,f2,f3*/
            FROM INSERTED第二种
    sp_addlinkedserver不需要每次在触发器里创建, 你先建过一次,那么服务器里就被保存了.
    报错原因应该也是由于 sql server中间给加多了空格.
      

  11.   

    同理,第二种排除空格问题的话应该会正常.driver={sql server}是odbc连接方式.
    同样也可以改成
    provider=sqloledb 这样的oledb连接方式
      

  12.   


    INSERT  OPENDATASOURCE(
             'SQLOLEDB',
             'Server=192.168.1.198;UID=sa;Password=123456'
             ).search.dbo.R_LouDongXinXi  /*可以加成 (f1,f2,f3)*/
    SELECT * FROM INSERTED
    我执行了上面的SQL,开始说没有启用远程/网络事务之类的,后来都解决了,可是插入数据的时候2个表都没有存到,也没有报错信息...
      

  13.   

    那就奇怪了. 有instead触发器?
      

  14.   

    我整个是这样写的,触发器我不怎么会
    ALTER trigger [dbo].[tb2_insert]
    on [dbo].[R_LouDongXinXi]
    for insert
    asINSERT  OPENDATASOURCE(
             'SQLOLEDB',
             'Server=192.168.1.160;UID=sa;Password=123456'
             ).search.dbo.R_LouDongXinXi  
    SELECT * FROM INSERTED
      

  15.   

    触发器没有问题,看看你是否建对了地方.比如你要在 192.168.1.1 这台服务器上的 search库下的r_loudongxinxi 表下插入数据时,自动 192.168.1.160 这台服务器插数据, 
    那么触发器要建在 192.168.1.1的服务器的search库的r_loudongxinxi表上.