zoukankan      html  css  js  c++  java
  • SQL2008-不同数据库之间的触发器

    create trigger tr_update_Table_1
      on   rwqd  
      FOR  UPDATE
      As
       update dataabc.dbo.Table_1  set NO2='OK' from  dataabc.dbo.Table_1 aa,inserted bb where aa.NO1=bb.xh
      go 

    PS:

    Create Table Student(              --学生表
            StudentID int primary key,       --学号
            ....
           )

          Create Table BorrowRecord(               --学生借书记录表

            BorrowRecord   int identity(1,1),       --流水号  
            StudentID      int ,                    --学号
            BorrowDate     datetime,                --借出时间
            ReturnDAte     Datetime,                --归还时间
            ...
          )

         --用到的功能有:

            --1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
            --2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
         --等等。

         --这时候可以用到触发器。对于1,创建一个Update触发器:

         Create Trigger truStudent
           On Student                         --在Student表中创建触发器

           for Update                          --为什么事件触发
         As                                        --事件触发后所要做的事情
           if Update(StudentID)           
           begin

             Update BorrowRecord
               Set StudentID=i.StudentID
               From BorrowRecord br , Deleted   d ,Inserted i      --Deleted和Inserted临时表

               Where br.StudentID=d.StudentID

           end       
                    
         --理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。

         --一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
          --                       虚拟表Inserted                     虚拟表Deleted

    --在表记录新增时     存放新增的记录                         不存储记录
    --         修改时           存放用来更新的新记录                   存放更新前的记录
    --         删除时           不存储记录                             存放被删除的记录


    --一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

    PS:========================================================================================
    --*********************************************************************************--                 链接服务器,不同服务器数据库之间的数据操作--*********************************************************************************
    1、--创建链接服务器
    exec sp_addlinkedserver   '链接服务器名', ' ', 'SQLOLEDB', '远程服务器名或ip地址 '
    exec sp_addlinkedsrvlogin  '链接服务器名', 'false ',null, '用户名', '密码'
    2、启动两台服务器的MSDTC服务
    MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。3、打开双方的135端口
    MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。
    使用“telnet IP 135”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放
    4、--如要创建触发器  
    create   trigger   t_test   on   test  
    for   insert,update,delete  
    as
    --加上下面两句,否则会提示新事务不能登记到指定事务处理器
    set    xact_abort   on 
    begin  distributed   tran
     delete   from   openrowset('sqloledb','xz';'sa';'',test.dbo.test)  
     where   id   in(select   id   from   deleted)  
     insert   into   openrowset('sqloledb','xz';'sa';'',test.dbo.test)  
     select   *   from   inserted  
    commit tran--查询示例
    select * from 链接服务器名.数据库名.dbo.表名 --导入示例
    select * into 表 from 链接服务器名.数据库名.dbo.表名 --以后不再使用时删除链接服务器
    exec sp_dropserver  '链接服务器名 ', 'droplogins ' --**************************************************************************************                --连接远程/局域网数据(openrowset/openquery/opendatasource) --**************************************************************************************
    --1、openrowset --查询示例
    select * from openrowset( 'SQLOLEDB', 'sql服务器名'; '用户名'; '密码',数据库名.dbo.表名) --生成本地表
    select * into 表 from openrowset( 'SQLOLEDB', 'sql服务器名'; '用户名'; '密码',数据库名.dbo.表名) --把本地表导入远程表
    insert openrowset( 'SQLOLEDB', 'sql服务器名'; '用户名'; '密码',数据库名.dbo.表名)
    select *from 本地表 --更新本地表
    update b
    set b.列A=a.列A
     from openrowset( 'SQLOLEDB', 'sql服务器名'; '用户名'; '密码',数据库名.dbo.表名)as a inner join 本地表 b
    on a.column1=b.column1 --2、openquery --首先创建一个连接创建链接服务器 exec sp_addlinkedserver   '链接服务器名', ' ', 'SQLOLEDB', '远程服务器名或ip地址'
    exec sp_addlinkedsrvlogin  '链接服务器名', 'false ',null, '用户名', '密码'
    --查询
    select * FROM openquery(链接服务器名,  'SELECT *  FROM 数据库.dbo.表名')
    --把本地表导入远程表
    insert openquery(链接服务器名,  'SELECT *  FROM 数据库.dbo.表名')
    select * from 本地表
    --更新本地表
    update b
    set b.列B=a.列B
    FROM openquery(链接服务器名,  'SELECT * FROM 数据库.dbo.表名') as a 
    inner join 本地表 b on a.列A=b.列A --3、opendatasourceSELECT   *
    FROM   opendatasource( 'SQLOLEDB',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码' ).test.dbo.表名
    --把本地表导入远程表
    insert opendatasource( 'SQLOLEDB',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码').数据库.dbo.表名
    select * from 本地表 

  • 相关阅读:
    Conversions
    Mispelling4
    A hard puzzle
    Easier Done Than Said?
    利用map可以对很大的数出现的次数进行记数
    A+B Coming
    结构体成员变量
    NSString 类介绍及用法
    复习回顾
    函数与方法对比
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4642789.html
Copyright © 2011-2022 走看看