SQL Server 跨库/服务器查询

这篇具有很好参考价值的文章主要介绍了SQL Server 跨库/服务器查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 SQL Server 跨库/服务器查询

1.1 跨库查询

在同一服务器下的跨库查询较为简单,示例

Database.DatabaseSchema.DatabaseObject
# 示例 [SqlMatc] 数据库中,查询数据库[SQLATM]里的 DeptSales_copy 表里的所有数据
select * from [SQLATM].[dbo].[DeptSales_copy]

1.2 跨服务器查询

进行跨服务器查询前提是在本地服务器上创建链接服务器。

1.2.1 创建链接服务器

方法一:利用系统存储过程 sp_addlinkedserver

sp_addlinkedserver

创建链接服务器。 链接服务器提供对 OLE DB 数据源的分布式异类查询的访问权限。 使用 sp_addlinkedserver创建链接服务器后,可对此服务器运行分布式查询。 如果将链接服务器定义为 SQL Server 实例,则可以执行远程存储过程。

权限

语句 sp_addlinkedserver 需要 ALTER ANY LINKED SERVER 权限。 (“SQL Server Management Studio新建链接服务器”对话框的实现方式需要固定服务器角色的成员sysadmin身份。)

参数解读

sp_addlinkedserver [ @server = ] 'server' 	-- 链接服务器的名称
    [ , [ @srvproduct = ] 'product_name' ]  -- 链接服务器的 OLE DB 数据源的产品名
    										-- product_name值为 nvarchar (128) ,
    										-- 默认值为 NULL。 
    									 -- 如果值为SQL Server,则无需指provider_name、
    									 -- data_source、位置、provider_string和目录。
    										
    [ , [ @provider = ] 'provider_name' ] 	-- 唯一编程标识符。建议使用 MSOLEDBSQL 而不是 SQLNCLI。
    [ , [ @datasrc = ] 'data_source' ] -- 目的服务器地址
    [ , [ @location = ] 'location' ]   -- 本地登录
    [ , [ @provstr = ] 'provider_string' ] -- 标识唯一数据源的特定于 OLE DB 提供程序的连接字符串。
    [ , [ @catalog = ] 'catalog' ] -- 与 OLE DB 提供程序建立连接时要使用的目录。
    

链接示例:

if exists(select * from sys.servers where name='LinkedServerName')
begin
	--删除运行本地与远程之间的用户映射
	execute sys.sp_droplinkedsrvlogin @rmtsrvname='LinkedServerName', @locallogin=null
	--删除链接服务器
	execute sys.sp_dropserver @server='LinkedServerName', @droplogins='droplogins'
end
go

EXEC sp_addlinkedserver
     @server = 'LinkedServerName'	-- 目的服务器别名
    ,@srvproduct = ''
    ,@provider = 'MSOLEDBSQL' 
    ,@datasrc = '192.168.3.21' -- 目的服务器IP地址
    ,@location = ''	-- 本地登录
    ,@provstr = '' -- 标识唯一数据源的特定于 OLE DB 提供程序的连接字符串。
    --@catalog = '';	-- 指定目录 默认值为 NULL

-- 将凭据和选项添加到此链接服务器。
EXEC sp_addlinkedsrvlogin
	 @rmtsrvname = 'LinkedServerName'
	,@useself = 'false'	-- 是否通过模拟登录 or 显示的提交登录名和密码链接到远程服务器
	,@rmtuser = 'sa'	-- 登录名
	,@rmtpassword = 'root';	-- 密码

EXEC sp_serveroption 'LinkedServerName', 'rpc', true;	-- 从指定的服务器启用远程过程调用 (RPC)
EXEC sp_serveroption 'LinkedServerName', 'rpc out', true;	-- 对指定的服务器启用 RPC。

-- 查询示例 select * from Server.Database.DatabaseSchema.DatabaseObject
SELECT name FROM [LinkedServerName].master.sys.databases;  

此处将链接SQL Server服务器封装成了名为RemoteConnectionServer的存储过程方便使用

在此存储过程中需要提供四个参数,目的服务器别名(见名知义)、目的服务器IP、目的服务器登录名以及密码。即可创建一个服务器链接。(注意此存储过程只创建了一个简单的链接服务器,设置了必要的链接参数,使用时请确保参数够用。

create proc RemoteConnectionServer
	@LinkedServerName nvarchar(255)	-- 目的服务器别名
	,@LinkedServerIP nvarchar(255) -- 目的服务器IP地址
	,@userName nvarchar(255)	-- 登录名
	,@password nvarchar(255)	-- 密码
as
	-- 查找链接服务器是否已创建,若创建则删除
	if exists(select * from sys.servers where name= @LinkedServerName)
	begin
		-- 删除运行本地与远程之间的用户映射
		execute sys.sp_droplinkedsrvlogin @rmtsrvname= @LinkedServerName, @locallogin=null
		--删除链接服务器
		execute sys.sp_dropserver @server=@LinkedServerName, @droplogins='droplogins'
	end

	-- 创建链接服务器 
	exec sp_addlinkedserver
		 @server = @LinkedServerName	-- 目的服务器别名
		,@srvproduct = ''
		,@provider = 'MSOLEDBSQL' 
		,@datasrc = @LinkedServerIP -- 目的服务器IP地址
		,@location = ''	-- 本地登录
		,@provstr = '' -- 标识唯一数据源的特定于 OLE DB 提供程序的连接字符串。
		--@catalog = '';	-- 指定目录 默认值为 NULL

	-- 将凭据和选项添加到此链接服务器。
	exec sp_addlinkedsrvlogin
		 @rmtsrvname = @LinkedServerName
		,@useself = 'false'	-- 是否通过模拟登录 or 显示的提交登录名和密码链接到远程服务器
		,@rmtuser = @userName	-- 登录名
		,@rmtpassword = @password;	-- 密码

	-- 设置服务器选项
	exec sp_serveroption @LinkedServerName, 'rpc', true;	-- 从指定的服务器启用远程过程调用 (RPC)
	exec sp_serveroption @LinkedServerName, 'rpc out', true;	-- 对指定的服务器启用 RPC。

go

执行存储过程

declare	@LinkedServerName nvarchar(255)	= 'linkName'
declare	@LinkedServerIP nvarchar(255) = '192.168.3.21'
declare	@userName nvarchar(255)	= 'sa'
declare	@password nvarchar(255)	= '****'
-- 执行
exec RemoteConnectionServer @LinkedServerName, @LinkedServerIP, @userName, @password

-- 测试
SELECT name FROM linkName.master.sys.databases;  

方法二:利用SSMS创建链接服务器

下面以链接192.168.2.21 SQL Server 服务器为例:

1 打开SSMS链接到本地服务器

2 选择服务器对象–>链接服务器
SQL Server 跨库/服务器查询,SQLServer,服务器,sqlserver

3 链接服务器 右键 新建链接服务器 常规页

PS:如果勾选服务器类型为"SQL Server",则此处’‘链接服务器’'名必须为IP 地址。若选择"其他数据源",此处的链接服务器名作为映射存在(别名), 在数据源处填写IP地址。

当然你也可以选择其他数据源去链接 SQL Server 服务器。

SQL Server 跨库/服务器查询,SQLServer,服务器,sqlserver

4 选择“安全性”页
SQL Server 跨库/服务器查询,SQLServer,服务器,sqlserver

5 选择 “服务器选项” 将 RPC 与 RPC Out 设置为True,默认为False。

  • RPC
    从指定的服务器启用远程过程调用 (RPC)。
  • RPC Out
    对指定的服务器启用 RPC。
    SQL Server 跨库/服务器查询,SQLServer,服务器,sqlserver

6 点击 “确定”,此时链接服务器目录下会出现你创建的连接服务器。

7 右键 测试链接
SQL Server 跨库/服务器查询,SQLServer,服务器,sqlserver

successs!
SQL Server 跨库/服务器查询,SQLServer,服务器,sqlserver

参考链接01:sp_addlinkedserver (Transact-SQL) - SQL Server | Microsoft Learn

参考链接02:创建链接服务器 - SQL Server | Microsoft Learn

1.2.2 跨库查询

-- 查询示例 select * from Server.Database.DatabaseSchema.DatabaseObject
SELECT * FROM [192.168.3.21].[GZ].[dbo].[Dept]

1.3 拓展:SQL Server 中所有权和用户与架构的分离

SQL Server 安全性的核心概念是对象的所有者具有管理这些对象的不可撤消的权限。 你不能删除对象所有者的特权,并且如果用户在数据库中拥有对象,你也不能将用户从此数据库中删除。

用户架构分离

通过用户架构分离,可实现管理数据库对象权限的更大灵活性。 架构是一个适用于数据库对象的命名容器,它使你能够将对象分组到单独的命名空间中。

用于引用对象的由四部分组成的命名语法指定架构名称。

Server.Database.DatabaseSchema.DatabaseObject

架构所有者和权限

任何数据库主体都可以拥有架构,并且一个主体可拥有多个架构。 您可以对架构应用安全规则,安全规则将由架构中的所有对象继承。 如果设置了对架构的访问权限,则当新对象添加到架构时,新对象会自动应用这些权限。 可以为用户分配一个默认的架构,且多个数据库用户可以共享同一架构。

默认情况下,当开发人员在架构中创建对象时,该对象由拥有架构的安全主体而不是开发人员拥有。 可以使用 ALTER AUTHORIZATION Transact-SQL 语句转移对象所有权。 尽管架构还可以包含由不同用户拥有的对象并且这些对象具有比分配给架构的权限更加细化的权限,但因为架构会增大管理权限的复杂度,因此不建议使用。 对象可以在架构之间移动,架构所有权也可以在主体之间转移。 可以在不影响架构的情况下删除数据库用户。

实现后向兼容性的内置架构

SQL Server 随附 9 个预定义架构,这些架构的名称与内置数据库用户和角色的名称相同:db_accessadmin、db_backupoperator、db_datareader、db_datawriter、db_ddladmin、db_denydatareader、db_denydatawriter、db_owner 和 db_securityadmin。 这些架构用于实现后向兼容性。 建议不要将它们用于用户对象。 可以删除与固定数据库角色同名的架构 - 除非它们已被使用,在这种情况下,drop-command 仅返回错误并阻止删除已使用的架构。 例如:

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_accessadmin')
DROP SCHEMA [db_accessadmin]
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'db_backupoperator')
DROP SCHEMA [db_backupoperator]

如果从模型数据库中删除这些架构,它们将不会显示在新数据库中。 不能删除包含对象的架构。

无法删除以下架构:

  • dbo
  • guest
  • sys
  • INFORMATION_SCHEMA

sysINFORMATION_SCHEMA 架构是为系统对象而保留的。 您不能在这些架构中创建对象,而且不能删除它们。

dbo 架构

dbo 架构是每个数据库的默认架构。 默认情况下,使用 CREATE USER Transact-SQL 命令创建的用户的默认架构为 dbodbo 架构由 dbo 用户帐户拥有。

默认架构被分配为 dbo 的用户不会继承 dbo 用户帐户的权限。 用户不从架构继承权限;架构权限由架构中包含的数据库对象继承。 用户的默认架构仅用于对象引用,以防用户在查询对象时省略架构。

当使用部分名称来引用数据库对象时,SQL Server 首先在用户的默认架构中查找。 如果在此处未找到该对象,则 SQL Server 其次将在 dbo 架构中查找。 如果对象不在 dbo 架构中,则会返回一个错误。

参考链接:SQL Server 中所有权和用户与架构的分离 - SQL Server | Microsoft Learn文章来源地址https://www.toymoban.com/news/detail-706427.html

到了这里,关于SQL Server 跨库/服务器查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SqlServer2022服务器安装详细图文教程和SSMS数据库工具下载安装】

    官网地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 推荐安装微软官方SQL SERVER连接工具SQL Server Management Studio (SSMS),当然也可以使用Navicat SSMS下载:https://learn.microsoft.com/zh-CN/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16 向下翻可以选择下载的语言

    2024年02月08日
    浏览(36)
  • 查询sqlserver内存分配情况的SQL

    SELECT mg.granted_memory_kb, mg.session_id, t.text, qp.query_plan  FROM sys.dm_exec_query_memory_grants AS mg CROSS APPLY sys.dm_exec_sql_text(mg.sql_handle) AS t CROSS APPLY sys.dm_exec_query_plan(mg.plan_handle) AS qp ORDER BY 1 DESC OPTION (MAXDOP 1) USE master  GO ;WITH    cte   AS ( SELECT   RP.pool_id ,   RP.Name ,   RP.min_memory_percent ,  

    2024年02月09日
    浏览(31)
  • 【sqlserver】已成功与服务器建立链接,但是在登录过程中发生错误。(provider:TCP提供程序,error:0 - 指定的网络名不再可用。)

    配置管理器,mssqlserver的协议 Named Pipes 启用,重新sqlserver服务试一下,我是自己摸索这样解决的,不行的话,可以看下下面链接建议 error:0 - 指定的网络名不可用

    2024年01月18日
    浏览(26)
  • SqlServer2019—解决SQL Server 无法连接127.0.0.1的问题

    1、打开SQL Server 2019配置管理器 2、SQL Servere 网络配置(启用 Named Pipes 和 TCP/IP)  3、修改TCP/IP协议(右键选择属性—IP地址),具体如下图所示:  4、重启SQL Server服务  

    2024年02月11日
    浏览(35)
  • sql递归查询处理树状结构数据,适用于sqlserver和oracle

    在工作中用到根据某个组织的ID,查询当前所有的上级,并按层级返回 递归语法: 以with开头,再以2个查询用 union all连接,且2个查询列表字段和类型返回必须一致 向上查询数据,oo是最终返回的表,也可以写为with oo as .... 但是不能写为 with oo(FID,fname_l2 ,FPARENTID)  去掉某一

    2024年01月23日
    浏览(43)
  • SqlServer2016下载安装步骤详解 SQL Server2016的彻底删除_还能坚持的博客-CSDN博客_sqlserver2016完全卸载

    Windows 下安装sql server 2016(附安装包资源)_极光稻草人的博客-CSDN博客_sql server 2016 安装链接: 链接:https://pan.baidu.com/s/1rPG8Ya4jSbhmHvFCDzTVew  提取码:MXJ0 如果原来以及安装过sqlServer2016或其他版本的,需彻底删除,可参考: 遇到的问题: 1.polybase要求安装orcale jre 7更新 51或更

    2024年02月05日
    浏览(70)
  • 找不到“SqlServer”模块-- 在此计算机上找不到任何 SQL Server cmdlet。

    https://github.com/PowerShell/PowerShell/releases/tag/v7.2.2SQL Server Management Studio 18 启动触发器报错 标题: 找不到“SqlServer”模块 --------------- 在此计算机上找不到任何 SQL Server cmdlet。 在 https://powershellgallery.com/packages/SqlServer 上获取“SqlServer”模块 不使用 SQL Server cmdlet 启动 PowerShell? 有关帮

    2024年02月09日
    浏览(40)
  • 记录一次sqlserver启动不了的问题,windows不能在本地计算机启动sql server

    如果你是开机后突然启动不了的,大概率是关机的时候vpn忘了停止,然后开机后网络出现问题造成sqlserver用不了。用下面这个方法大概率可以启动吗,如果启动成功的话记得给我点个赞吧 第一步,关闭这三个sqlserver配置服务 第二步,重启电脑 第三步,从任务管理器打开服务,找到

    2024年02月03日
    浏览(32)
  • Navicat连接本地SqlServer出现 [08001][Microsoft][sQL Server Native Client 11.0]命名管道提供程序:无法打开与SQL Server等错误

      使用Navicat连接本地SqlServer [08001][Microsoft][sQL Server Native Client 11.0]命名管道提供程序:无法打开与SQL Server的连接[53].(53)[HYTO0] [Microsoft][SQL Server Native Client 11.0]登录超时已过期(O) [08001][Microsoft][SQL Server Native Client11.0]与SQL Server建立连接时发生了与网络相关的或特定于实例的错误。

    2024年02月11日
    浏览(49)
  • SQL Server链接服务器

    SQL Server 中存在可以链接到其他服务器的选项,一般情况下是用来与别的 SQL Server 数据库相连接,但是有时候也可以与一个Microsoft Access数据库 相连接。这样的操作是通过链接服务器节点实现的。 链接服务器节点可以连接到另一个数据库,通常/通常在不同的机器上运行,也

    2023年04月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包