SQL Server 跨库/服务器查询

news2025/7/17 2:56:34

这里写目录标题

  • 1 SQL Server 跨库/服务器查询
    • 1.1 跨库查询
    • 1.2 跨服务器查询
      • 1.2.1 创建链接服务器
      • 1.2.2 跨库查询
    • 1.3 拓展: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 选择服务器对象–>链接服务器
在这里插入图片描述

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

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

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

4 选择“安全性”页
在这里插入图片描述

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

  • RPC
    从指定的服务器启用远程过程调用 (RPC)。
  • RPC Out
    对指定的服务器启用 RPC。
    在这里插入图片描述

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

7 右键 测试链接
在这里插入图片描述

successs!
在这里插入图片描述

参考链接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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT Creator更改主题和编辑器风格(附几款黑色主题)

适用于qtcreator 一、使用自带主题与编辑器风格 打开Qt选择"工具"->"选项"; 2. 选择"环境"->"Theme"切换不同的主题风格 这里切换的是外边框的风格,如果编辑器中有同名的风格,编辑器的风格也…

【计算机基础知识9】前端设计模式与常见类型

目录 一、前言 二、设计模式的基本概念和原则 三、创建型设计模式 四、结构型设计模式 五、行为型设计模式 六、MVC和MVVM框架中的设计模式 七、实际应用案例分析 一、前言 在软件开发领域,设计模式是一种解决常见问题的最佳实践,它可以帮助开发…

手敲Cocos简易地图编辑器:人生地图是一本不断修改的书,每一次编辑都是为了克服新的阻挡

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。 在上一篇文章,笔者给大家讲解了在Cocos独立游戏开发框架中,如何自定义实现Tile地图管理器,成功地在游戏中优化加载一张特大的地图。接下来…

持久层框架之Mybatis

概述 MyBatis是apache的一个开源项目iBatis,2010年改名为MyBatis,2013年11月迁移到GithubMyBatis是一款优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结…

软件设计模式系列之二——抽象工厂模式

1 抽象工厂模式的定义 抽象工厂模式是一种创建型设计模式,它提供了一种创建一组相关或相互依赖对象的方式,而无需指定它们的具体类。该模式以一组抽象接口为核心,包括抽象工厂接口和一组抽象产品接口,每个具体工厂类负责创建特定…

More Effective C++学习笔记(5)

目录 条款25:将构造函数和非成员函数虚化条款26:限制某个类所能产生的对象数量条款27:要求(或禁止)对象产生于heap(堆)之中条款28:智能指针条款29:引用计数条款30&#x…

uview indexList 按字母跳转不了

点击字母跳转不到位的问题&#xff1a;在<u-index-list>添加方法select“clickSelect“ 锚点要加id&#xff0c;用对应的字母做为id值&#xff0c; <u-index-anchor :id"key" :index"key"/> <template><view><view class&qu…

法国新法案强迫 Firefox 等浏览器审查网站

导读Mozilla 基金会已发起了一份请愿书&#xff0c;旨在阻止法国政府强迫 Mozilla Firefox 等浏览器审查网站。 据悉&#xff0c;法国政府正在制定一项旨在打击网络欺诈的 SREN 法案 (“Projet de loi Visant scuriser et reguler lespace numrique”)&#xff0c;包含大约 2…

将本地jar包手动添加到Maven仓库依赖处理

一、起因 在日常开发中&#xff0c;经常会遇到一些情况&#xff0c;就是在更新Maven时&#xff0c;从网上下载jar包的时候网络不稳定或者其他原因导致jar包数据缺失而导致的依赖无法正常引入的情况. 还有一些其他情况如个人jar包一类的。 二、解决 以前以上这些情况&#x…

三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析

三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析 随着三维模型在各个领域的广泛应用&#xff0c;对于其格式的轻量化压缩处理和效率提高的需求也越发迫切。本文将介绍一些技术方法&#xff0c;帮助实现三维模型3DTile格式的轻量化压缩处理并提高处理效率。 首先&#x…

手写Spring:第14章-自动扫描Bean对象注册

文章目录 一、目标&#xff1a;自动扫描Bean对象注册二、设计&#xff1a;自动扫描Bean对象注册三、实现&#xff1a;自动扫描Bean对象注册3.0 引入依赖3.1 工程结构3.2 Bean生命周期中自动加载包扫描注册Bean对象和设置占位符属性类图3.3 主力占位符配置3.4 定义拦截注解3.4.1…

从零到MySQL性能优化大师

一.MySQL架构 二.优化与执行 执行计划是MySQL优化器为了优化查询而生成的一种数据结构&#xff0c;它记录了数据库系统执行查询时所采取的操作流程&#xff0c;即对查询语句的各部分如何进行处理以最终得到查询结果的过程。执行计划通常被表示为一棵树状结构&#xff0c;节点代…

编程语言的类型划分

汇编语言 低级语言&#xff0c;通过汇编器翻译成机器语言 MOV、PUSH、ADD等 特点&#xff1a; 对机器友好、执行效率高、移植性差。 人类操作不太方便&#xff0c;需要专业人员。 高级语言 C、C、Java、Python、Golang等 最终还是会转化成为机器语言。 执行过程划分 编译型 ●…

华为云云耀云服务器L实例评测|使用Linux系统与Docker部署.net/c#项目

目录 前言 如何在CentOS运行项目 登录CentOS 使用Rider打包 使用Visual Studio打包 项目运行 后台运行 开放端口 如何在Docker中运行项目 项目运行 前言 本章详细介绍&#xff0c;.net Core项目从打包到部署上华为云云耀云服务器L实例的过程与一些细节问题。在这里…

XFF漏洞利用([SWPUCTF 2021 新赛]Do_you_know_http)

原理 常见的存在HTTP头注入的参数 User-Agent&#xff1a;使得服务器能够识别客户使用的操作系统&#xff0c;浏览器版本等.&#xff08;很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中&#xff09; Cookie&#xff1a;网站为了辨别用户身份进行se…

前端js下载zip文件异常问题解决

目录 一&#xff0c;本文解决问题如下 二&#xff0c;原下载代码 1&#xff0c;ajax get 下载文件 2&#xff0c;下载异常图&#xff1a; 三&#xff0c;成功下载的 1&#xff0c; JQuery 实现文件下载xhr 2&#xff0c;图例 引言&#xff1a; 本人使用的ajax 下载&…

量化:基于支持向量机的择时策略

文章目录 参考机器学习简介策略简介SVM简介整体流程收集数据准备数据建立模型训练模型测试模型调节参数 参考 Python机器学习算法与量化交易 利用机器学习模型&#xff0c;构建量化择时策略 机器学习简介 机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。…

Mybatis日期检索格式报错

问题复现 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String ##…

适用于Linux的Windows子系统(PHP搭建lmap、redis、swoole环境)

目录 前言 一、Windows安装Linux子系统 二、Ubuntu搭建PHP开发环境 1.PHP 安装 2.Apache2 安装 3.MySQL安装 4.Redis安装 5.Swoole安装 总结 前言 系列分为三章&#xff08;从安装到项目使用&#xff09;&#xff1a; 一、适用于Linux的Windows子系统&#xff08;系统安装步骤…

提升你的Android开发技能:从AR/VR沉浸到UI设计和故障排除

文章目录 探索最新AR/VR应用在教育、游戏、医疗等领域的应用教育领域游戏领域医疗领域 深入了解Android内存管理与性能优化的方法与技巧垃圾回收机制内存泄漏使用弱引用避免过度渲染内存优化图像优化延迟加载Android中的调试技术应用程序分析 分享如何提高Android应用的易用性和…