时间:2021-07-01 10:21:17 帮助过:4人阅读
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 本地表 
SQL2008-不同数据库之间的触发器
标签: