Sqlserver分布式跨数据库查询、Join,以及分布式事务

简言:

  • 这篇文章我要谈一谈SQL Server分布式跨服务器查询,多表Join,以及分布式事务的处理

SqlServer跨服务器查询的方式

  • 以往自己才疏学浅,学习了一波之后,在这记录下来。

1. 使用sp_addlinkedserver和sp_addlinkedsrvlogin存储过程添加linkserver和登录

                          --别名                        //ip地址
exec sp_addlinkedserver     'interlink','','SQLOLEDB', 'xxx.xxx.xx.xx'
                          --别名                    --登录名   --密码
exec sp_addlinkedsrvlogin 'interlink', 'false ',null, 'xxx', 'xxxxx'
--注意:两个别名要一致

--然后就可以通过以下方式进行联合查询:
                                                          --上面的别名 --数据库名
select * from [v3cdemo].[dbo].[AmmUnit] as ad1 right join interlink.[v3cdemo].
--表名
[dbo].[Address] as ad2 on ad1.unitID=ad2.AddressID

--删除某个linkserver
exec sp_dropserver  'interlink ', 'droplogins ' 

运行效果如图:

2. 使用openrowset函数

exec sp_configure 'show advanced options',1
go
RECONFIGURE WITH OVERRIDE;    --这里一定要加 with override 不然会出现不允许修改错误

exec sp_configure 'Ad Hoc Distributed Queries',1
go
RECONFIGURE WITH OVERRIDE;
                                          --ip地址      --用户名   --密码
select * from openrowset( 'SQLOLEDB ', '192.168.0.12 '; 'sa'; '*bf123',[v3cdemo].[dbo].[Address]) --数据库.表名

exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure

--1. 有关 show advanced options的介绍请阅读:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2005/ms188265(v=sql.90)
--2. Ad Hoc Distributed Queries :分散式查询。
  • 运行结果如下:

3. 使用openquery函数

  • openquery是基于linkserver实现的,得先添加一个linkserver
                          --别名                        //ip地址
exec sp_addlinkedserver     'interlink','','SQLOLEDB', 'xxx.xxx.xx.xx'
                          --别名                    --登录名   --密码
exec sp_addlinkedsrvlogin 'interlink', 'false ',null, 'xxx', 'xxxxx'
          --使用openquery函数
select * FROM openquery(interlink,  'SELECT *  FROM [v3cdemo].[dbo].[Address] ') 

--也可以把本地表导入到服务器表
--insert openquery(interlink,  'SELECT *  FROM dbName.dbo.tableName ') select * from localTableName 
  • 运行结果如图:

4. 使用opendatasource函数

  • SELECT   * FROM   opendatasource( 'SQLOLEDB ',  'Data Source=xxx.xxx.x.xx;User ID=xx;Password=xxx' ).[v3cdemo].[dbo].[Address]
    
    --[v3cdemo]:是数据库名
    --[dbo].[Address]:是表名
    --Data Source=xxx.xxx.x.xx;User ID=xx;Password=xxx这个类似于我们的连接字符串,只是不需要指定数据库。
    
  • 运行结果如图:

SqlServer分布式事务:

  • .net framework:

    • TransactionScpoe:TransactionScope是ADO.Net提供的事务机制(需要添加对system.transactioins程序集的引用),在普通ADO.Net代码中也可以用、在Entity Framework、Dapper等ORM中也可以用;把相关需要事务处理的代码用TransactionScope包裹起来即可,只要没有Complete()的就会回滚

      • 深入:
        使用TransactionScope包围的范围,只要是同一个连接字符串创建的SqlConnection对象(MySQL等也支持),即使是多个Connection对象也会在一个事务中。
        还支持嵌套事务,这个在开发大型系统中会涉及到,因为大型系统中一个方法会在很多地方被使用,一个方法有时候是自己独立完成一件事情,有时候是被别人组合完成一件事。 TransactionScope可以嵌套, TransactionScope嵌套的情况,只有最外层的TransactionScope提交后所有的操作才会提交,否则所有操作都回滚。
      • 注意:如果在TransactionScope嵌套的范围内出现多个不同连接字符串构成的Connection(比如同时连接多个同构或者异构的数据库)则需要启用MSDTC服务,否则会“MSDTC不可用”的异常,即使数据库ip地址从127.0.0.1变成localhost甚至加上一个无关痛痒的空格都会要求启用MSDTC服务。
  • .net core:
  • 因为.net core已经是跨平台了,而MSDTC服务是windows平台的东西,所以.net core 中的Transactionscope实现不包括对分布式事务的支持,因此不能使用 TransactionScope 或CommittableTransaction 来跨多个资源管理器协调。
  • 可以使用 Saga 来实现事务一致性:https://www.upyun.com/opentalk/310.html(saga只支持postpresql和mysql数据库。偷懒)
  • sage GitHub地址C#包:https://github.com/OpenSagas-csharp/servicecomb-pack-csharp

原文地址:https://www.cnblogs.com/norain/p/sqlserver_DCS.html

时间: 2024-08-01 14:21:07

Sqlserver分布式跨数据库查询、Join,以及分布式事务的相关文章

SqlServer分布式跨数据库查询Join

--step1 创建链接服务器 exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB', 'ip地址' exec sp_addlinkedsrvlogin 'srv_lnk', 'false ',null, 'sql登陆名', '密码' --exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB', '192.168.1.58' --exec sp_addlinkedsrvlogin 'srv_lnk', 'false

SQL Server 跨数据库查询

不同服务器数据库之间的数据操作 --创建链接服务器 exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 from ITSV.数据库名.dbo.表名 --以后不再使用时

爆料:为什么Entity Framework不能进行跨数据库查询

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在上篇随笔中提到"对于跨数据库查询,我们没有找到通过LINQ to Entities实现的方法".后来仔细想想,从理论来讲,实现跨数据库查询应该不难啊,与非跨数据库查询相比,只是多了个数据库名,比如下面的非跨数据库查询语句: SELE

如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参

[前言] 今天来给大家介绍下如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参! 因为我现在所测的系统模块中部分表在不同的数据库中,所以在用JDBC Request查询数据的时候遇到了这么一个跨数据库查询的问题,现在我就来说下我今天使用的办法,希望有不足之处大家多多指导下! 1.首先我们点击测试计划添加配置元件->JDBC Connection Configuration 2.然后我们新建一个线程组A,在线程组A下新建一个JDBC Request

SQL分布式查询、跨数据库查询

--[方法1]连接服务器方法 --step1 创建链接服务器 exec sp_addlinkedserver     'srv_lnk','','SQLOLEDB', 'ip地址' exec sp_addlinkedsrvlogin 'srv_lnk', 'false ',null, 'sql登陆名', '密码' --exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB', '192.168.1.58' --exec sp_addlinkedsrvlogi

oracle 开发笔记“跨数据库查询复制”

1.方法一:创建DBL(data base link) CREATE PUBLIC DATABASE LINK 数据链名称 CONNECT TO 登陆用户名 IDENTIFIED BY 密码 USING '(DESCRIPTION =     (ADDRESS_LIST =       (ADDRESS = (PROTOCOL = TCP)(HOST = 对方Oracle服务器的IP地址)(PORT = 端口号))     )     (CONNECT_DATA =(SERVICE_NAME =

【SQL Server】同一服务器上的跨数据库查询

数据库情况: --aDB  表A --bDB  表B 那么在aDB查询bDB的数据 1 select * from bDB.dbo.B 也可以轻松写出以下语句 1 select UserId from A where UserId in (select UserId from bDB.dbo.B)

Oracle如何实现跨数据库查询

转发:http://www.linuxidc.com/Linux/2012-02/53974.htm 实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数,然后插入当前的数据库中的一个表中. 二. 实现方法步骤: 1. 创建存储过程 2. 在存储过程中先创建database link 3. 创建成功 4. 从另一个数据库取出数据插入到当前数据库中 5. 任务完成 三. 创建DBLINK的方法: 1. create publ

sql跨数据库查询方法

http://www.cnblogs.com/xingluzhe/archive/2012/02/01/2334311.html SELECT u_name     FROM OPENROWSET('sqloledb','DRIVER={SQL Server};SERVER=119.48.48.152;UID=y_ydgl;PWD=55555////\',DB.dbo.y_users)  where u_name='1'   UNION   allSELECT u_name     FROM O