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






2.89/5 (10投票s)
2004年12月14日
4分钟阅读

77403
在分布式服务器和查询中使用事务 - SQL Server 中的链接服务器。
引言
例如,假设您有一个库存数据库和一个销售数据库,它们位于不同的地理位置。然后,您需要在两个服务器上都使用操作查询。在这种情况下,让我们看看如何实现事务。
MS DTC
为了安全地连接分布式事务,Microsoft 为我们提供了 MS DTC,即 Microsoft 分布式事务协调器。它使用称为2PC 的两阶段提交协议。
两阶段提交协议的两个阶段是:
- 准备阶段
- 提交阶段
准备阶段
本地服务器的 MS DTC 向事务中使用的所有服务器发送请求以启动会话,然后返回成功/失败确认。远程服务器在他们端执行所有原子性和数据一致性操作。
如果任何一个服务器向本地服务器返回失败消息,则该事务被视为不确定事务,可以在任何时候回滚。
提交阶段
当所有服务器都返回成功消息时,本地服务器会将所有远程服务器的消息发送到提交,并接收成功/失败响应。如果失败,则整个事务将在所有服务器上回滚。
Commands
BEGIN DISTRIBUTED TRAN
COMMIT TRAN
ROLLBACK TRAN
需要注意的关键点
- 不能嵌套。
- 本地事务可以轻松升级。
- MS DTC 必须在本地服务器上运行。
好的,现在让我们看看如何物理地实现这一点。
要完成此任务,您需要执行以下步骤:
- 将远程服务器添加为链接服务器。
- 向添加的链接服务器添加服务器登录。
- 如果您正在使用来自远程服务器的
Sproc
,请为 RPC 调用进行设置。 - 使用完整名称来检索数据。
sp_AddLinikedServer [@server=], [@srvProduct=], [@Provider=], [@DataSrc=], [@Location=], [@provStr=], [@Catalog=]
通过这些步骤,您可以添加服务器。所有参数都可以自行解释,因此我跳过介绍!在这里,重要的参数是
server
、srvProduct
(如果您添加 SQL Server 以外的服务器,如 Oracle、Exchange...)和ProvStr
。sp_AddLinkedSrvLogin
参数是
- [
@rmtsrvName=
] - 服务器名称 - [
@useSelf=
] - 将其设置为 true,以便将当前的登录信息传递过去。如果使用 NT 身份验证,则非常有用。 - [
@LocalLogin=
] - 执行映射的用户的名称! - [
@rmtUser=
] - 本地登录的别名(远程服务器的登录信息)。 - [
@rmtPasssword=
] -rmtUser
的密码。
删除链接服务器
sp_dropServer '<Servername>'
删除链接服务器登录信息
sp_dropLinkedSrvLogin '<Servername>'
- [
- 要从远程服务器使用
sproc
,您需要使用sproc sp_ServerOption
在两个服务器上启用 RPC 调用,包括 RPC 和 RPC OUT。sp_ServerOption RPC
- 从远程服务器到本地服务器。sp_ServerOption RPC OUT
- 从本地服务器到远程服务器。
现在您已完成访问和查询远程服务器(链接服务器)的所有设置。
- 如何查询??
一个大问题,不是吗?但 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
注意:所有存储过程都有一些参数,我真的很厌烦在这里解释它们。您可以在书中在线找到它们!
除了上述检索方法外,您还可以使用其他方法来实现相同目的。它们是:
- OPENQUERY
- 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 在工作,并且还可以保证您的数据安全!
无法在链接服务器上使用的功能
CREATE
/ALTER
/DROP
对象!- 如果在
SELECT
子句中使用BLOB
对象,则无法使用 Order by。 - 任何与
BLOB
相关的语句都不能在链接服务器中使用。
结论
通过这些,我相信您已经能够拥有并运行一个链接服务器。请注意,在 EM 中注册服务器与此相同!欢迎进一步澄清!