65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Server 2000 在分布式服务器上使用事务 - 链接服务器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.89/5 (10投票s)

2004年12月14日

4分钟阅读

viewsIcon

77403

在分布式服务器和查询中使用事务 - SQL Server 中的链接服务器。

引言

例如,假设您有一个库存数据库和一个销售数据库,它们位于不同的地理位置。然后,您需要在两个服务器上都使用操作查询。在这种情况下,让我们看看如何实现事务

MS DTC

为了安全地连接分布式事务,Microsoft 为我们提供了 MS DTC,即 Microsoft 分布式事务协调器。它使用称为2PC 的两阶段提交协议。

两阶段提交协议的两个阶段是:

  1. 准备阶段
  2. 提交阶段

准备阶段

本地服务器的 MS DTC 向事务中使用的所有服务器发送请求以启动会话,然后返回成功/失败确认。远程服务器在他们端执行所有原子性和数据一致性操作。

如果任何一个服务器向本地服务器返回失败消息,则该事务被视为不确定事务,可以在任何时候回滚。

提交阶段

当所有服务器都返回成功消息时,本地服务器会将所有远程服务器的消息发送到提交,并接收成功/失败响应。如果失败,则整个事务将在所有服务器上回滚。

Commands

BEGIN DISTRIBUTED TRAN
COMMIT TRAN
ROLLBACK TRAN

需要注意的关键点

  1. 不能嵌套。
  2. 本地事务可以轻松升级。
  3. MS DTC 必须在本地服务器上运行。

好的,现在让我们看看如何物理地实现这一点。

要完成此任务,您需要执行以下步骤:

  1. 将远程服务器添加为链接服务器。
  2. 向添加的链接服务器添加服务器登录。
  3. 如果您正在使用来自远程服务器的Sproc,请为 RPC 调用进行设置。
  4. 使用完整名称来检索数据。
  1. sp_AddLinikedServer [@server=],
                                 [@srvProduct=],
                                 [@Provider=], 
                                 [@DataSrc=],
                                 [@Location=], 
                                 [@provStr=], 
                                 [@Catalog=]

    通过这些步骤,您可以添加服务器。所有参数都可以自行解释,因此我跳过介绍!在这里,重要的参数是serversrvProduct(如果您添加 SQL Server 以外的服务器,如 Oracle、Exchange...)和ProvStr

  2. sp_AddLinkedSrvLogin

    参数是

    • [@rmtsrvName=] - 服务器名称
    • [@useSelf=] - 将其设置为 true,以便将当前的登录信息传递过去。如果使用 NT 身份验证,则非常有用。
    • [@LocalLogin=] - 执行映射的用户的名称!
    • [@rmtUser=] - 本地登录的别名(远程服务器的登录信息)。
    • [@rmtPasssword=] - rmtUser 的密码。

    删除链接服务器

     sp_dropServer '<Servername>'

    删除链接服务器登录信息

    sp_dropLinkedSrvLogin '<Servername>'
  3. 要从远程服务器使用sproc,您需要使用sproc sp_ServerOption在两个服务器上启用 RPC 调用,包括 RPC 和 RPC OUT。
    • sp_ServerOption RPC - 从远程服务器到本地服务器。
    • sp_ServerOption RPC OUT - 从本地服务器到远程服务器。

    现在您已完成访问和查询远程服务器(链接服务器)的所有设置。

  4. 如何查询??

    一个大问题,不是吗?但 SQL 提供了一个简单的答案……只需使用完整名称,例如:

    Linked server Name: MyRemoteServer
    DB_OWNER: Senthil
    Database: dbTest
    Table: tblTest

    这是您的查询

    SELECT a.* FROM MyRemoteServer.dbTest.Senthil.tblTest AS A

    即:select .......... from LinkedServerName.DataBase / Catalog name.Owner.Table /Entity。您可以像处理本地数据库一样加入此结果并执行任何操作。

    要从链接服务器检索元数据,您可以使用以下sproc

    sp_LinkedServers - List all active linked server
    sp_Catalog
    sp_Tables_ex
    sp_Columns_ex
    sp_table_previlages_ex
    sp_column_privilages_ex
    sp_Primarykeys
    sp_foreignkeys
    sp_indexes
    

    注意:所有存储过程都有一些参数,我真的很厌烦在这里解释它们。您可以在书中在线找到它们!

除了上述检索方法外,您还可以使用其他方法来实现相同目的。它们是:

  1. OPENQUERY
  2. OPENROWSET

OPENQUERY

为此,您需要先添加链接服务器!

  • 只要您的 OLEDB 提供程序支持,您就可以使用操作查询(插入/更新/删除)!
  • 您可以像始终处理本地服务器一样,将结果集与任何内容连接起来。

语法

SELECT ... FROM OPENQUERY('<Linked server name>','<Query>')

示例

            SELECT a.* 
            FROM OPENQUERY ('MyRemoteServer','Select * from Employee) AS A 
            Inner Join Department d ON d.DeptID = a.DeptID

注意:部门位于本地服务器!

OPENROWSET

这可以在不添加链接服务器的情况下使用,因为您将在查询本身中添加它们!!

语法

SELECT .. FROM OPENROWSET
       ('<Provider>','<Datasource/Catalog>','<Loginid>','<pwd>','<Query>')

性能问题

有一个称为排序规则的东西。它的作用非常出色,也是开发人员应该了解的!!

默认为off,您可以在以下位置将其设置为on

sp_ServerOption '<Servername>','Collation Compatible',True

如果将其设置为off,则从远程服务器检索到的数据会全部来自引用的表,而不管 WHERE 子句如何。在本地服务器上,WHERE 子句应用于结果集,例如,如果您有一个查询

SELECT * FROM employee WHERE salary >  10000

这里,所有员工记录都已获取到本地服务器,并在此结果集上应用了 WHERE 子句。因此,请将其打开,这样您至少有两个 CPU 在工作,并且还可以保证您的数据安全!

无法在链接服务器上使用的功能

  1. CREATE/ALTER/DROP 对象!
  2. 如果在 SELECT 子句中使用BLOB对象,则无法使用 Order by。
  3. 任何与BLOB相关的语句都不能在链接服务器中使用。

结论

通过这些,我相信您已经能够拥有并运行一个链接服务器。请注意,在 EM 中注册服务器与此相同!欢迎进一步澄清!

© . All rights reserved.