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

  • 相关阅读:
    阿里HBase高可用8年“抗战”回忆录
    Service Mesh 初体验
    阿里云HBase推出普惠性高可用服务,独家支持用户的自建、混合云环境集群
    Ververica Platform-阿里巴巴全新Flink企业版揭秘
    深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
    AI加持的阿里云飞天大数据平台技术揭秘
    Nacos 常见问题及解决方法
    数据上云,应该选择全量抽取还是增量抽取?
    一文带你了解 Flink Forward 柏林站全部重点内容
    Oracle数据库中序列(SEQUENCE)的用法详解
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4642789.html
Copyright © 2020-2023  润新知