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 本地表 

  • 相关阅读:
    Digital Video Stabilization and Rolling Shutter Correction using Gyroscope 论文笔记
    Distortion-Free Wide-Angle Portraits on Camera Phones 论文笔记
    Panorama Stitching on Mobile
    Natural Image Stitching with the Global Similarity Prior 论文笔记 (三)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(二)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(一)
    ADCensus Stereo Matching 笔记
    Efficient Large-Scale Stereo Matching论文解析
    Setting up caffe on Ubuntu
    Kubernetes配置Secret访问Harbor私有镜像仓库
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4642789.html
Copyright © 2011-2022 走看看