SQL?Server跨庫/服務(wù)器查詢及拓展知識點(diǎn)
1 SQL Server 跨庫/服務(wù)器查詢
1.1 跨庫查詢
在同一服務(wù)器下的跨庫查詢較為簡單,示例
Database.DatabaseSchema.DatabaseObject # 示例 [SqlMatc] 數(shù)據(jù)庫中,查詢數(shù)據(jù)庫[SQLATM]里的 DeptSales_copy 表里的所有數(shù)據(jù) select * from [SQLATM].[dbo].[DeptSales_copy]
1.2 跨服務(wù)器查詢
進(jìn)行跨服務(wù)器查詢前提是在本地服務(wù)器上創(chuàng)建鏈接服務(wù)器。
1.2.1 創(chuàng)建鏈接服務(wù)器
方法一:利用系統(tǒng)存儲過程 sp_addlinkedserver
sp_addlinkedserver
創(chuàng)建鏈接服務(wù)器。 鏈接服務(wù)器提供對 OLE DB 數(shù)據(jù)源的分布式異類查詢的訪問權(quán)限。 使用 sp_addlinkedserver創(chuàng)建鏈接服務(wù)器后,可對此服務(wù)器運(yùn)行分布式查詢。 如果將鏈接服務(wù)器定義為 SQL Server 實(shí)例,則可以執(zhí)行遠(yuǎn)程存儲過程。
權(quán)限
語句 sp_addlinkedserver 需要 ALTER ANY LINKED SERVER 權(quán)限。 (“SQL Server Management Studio新建鏈接服務(wù)器”對話框的實(shí)現(xiàn)方式需要固定服務(wù)器角色的成員sysadmin身份。)
參數(shù)解讀
sp_addlinkedserver [ @server = ] 'server' -- 鏈接服務(wù)器的名稱
[ , [ @srvproduct = ] 'product_name' ] -- 鏈接服務(wù)器的 OLE DB 數(shù)據(jù)源的產(chǎn)品名
-- product_name值為 nvarchar (128) ,
-- 默認(rèn)值為 NULL。
-- 如果值為SQL Server,則無需指provider_name、
-- data_source、位置、provider_string和目錄。
[ , [ @provider = ] 'provider_name' ] -- 唯一編程標(biāo)識符。建議使用 MSOLEDBSQL 而不是 SQLNCLI。
[ , [ @datasrc = ] 'data_source' ] -- 目的服務(wù)器地址
[ , [ @location = ] 'location' ] -- 本地登錄
[ , [ @provstr = ] 'provider_string' ] -- 標(biāo)識唯一數(shù)據(jù)源的特定于 OLE DB 提供程序的連接字符串。
[ , [ @catalog = ] 'catalog' ] -- 與 OLE DB 提供程序建立連接時(shí)要使用的目錄。
鏈接示例:
if exists(select * from sys.servers where name='LinkedServerName')
begin
--刪除運(yùn)行本地與遠(yuǎn)程之間的用戶映射
execute sys.sp_droplinkedsrvlogin @rmtsrvname='LinkedServerName', @locallogin=null
--刪除鏈接服務(wù)器
execute sys.sp_dropserver @server='LinkedServerName', @droplogins='droplogins'
end
go
EXEC sp_addlinkedserver
@server = 'LinkedServerName' -- 目的服務(wù)器別名
,@srvproduct = ''
,@provider = 'MSOLEDBSQL'
,@datasrc = '192.168.3.21' -- 目的服務(wù)器IP地址
,@location = '' -- 本地登錄
,@provstr = '' -- 標(biāo)識唯一數(shù)據(jù)源的特定于 OLE DB 提供程序的連接字符串。
--@catalog = ''; -- 指定目錄 默認(rèn)值為 NULL
-- 將憑據(jù)和選項(xiàng)添加到此鏈接服務(wù)器。
EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'LinkedServerName'
,@useself = 'false' -- 是否通過模擬登錄 or 顯示的提交登錄名和密碼鏈接到遠(yuǎn)程服務(wù)器
,@rmtuser = 'sa' -- 登錄名
,@rmtpassword = 'root'; -- 密碼
EXEC sp_serveroption 'LinkedServerName', 'rpc', true; -- 從指定的服務(wù)器啟用遠(yuǎn)程過程調(diào)用 (RPC)
EXEC sp_serveroption 'LinkedServerName', 'rpc out', true; -- 對指定的服務(wù)器啟用 RPC。
-- 查詢示例 select * from Server.Database.DatabaseSchema.DatabaseObject
SELECT name FROM [LinkedServerName].master.sys.databases;
此處將鏈接SQL Server服務(wù)器封裝成了名為RemoteConnectionServer的存儲過程方便使用
在此存儲過程中需要提供四個(gè)參數(shù),目的服務(wù)器別名(見名知義)、目的服務(wù)器IP、目的服務(wù)器登錄名以及密碼。即可創(chuàng)建一個(gè)服務(wù)器鏈接。(注意此存儲過程只創(chuàng)建了一個(gè)簡單的鏈接服務(wù)器,設(shè)置了必要的鏈接參數(shù),使用時(shí)請確保參數(shù)夠用。)
create proc RemoteConnectionServer @LinkedServerName nvarchar(255) -- 目的服務(wù)器別名 ,@LinkedServerIP nvarchar(255) -- 目的服務(wù)器IP地址 ,@userName nvarchar(255) -- 登錄名 ,@password nvarchar(255) -- 密碼 as -- 查找鏈接服務(wù)器是否已創(chuàng)建,若創(chuàng)建則刪除 if exists(select * from sys.servers where name= @LinkedServerName) begin -- 刪除運(yùn)行本地與遠(yuǎn)程之間的用戶映射 execute sys.sp_droplinkedsrvlogin @rmtsrvname= @LinkedServerName, @locallogin=null --刪除鏈接服務(wù)器 execute sys.sp_dropserver @server=@LinkedServerName, @droplogins='droplogins' end -- 創(chuàng)建鏈接服務(wù)器 exec sp_addlinkedserver @server = @LinkedServerName -- 目的服務(wù)器別名 ,@srvproduct = '' ,@provider = 'MSOLEDBSQL' ,@datasrc = @LinkedServerIP -- 目的服務(wù)器IP地址 ,@location = '' -- 本地登錄 ,@provstr = '' -- 標(biāo)識唯一數(shù)據(jù)源的特定于 OLE DB 提供程序的連接字符串。 --@catalog = ''; -- 指定目錄 默認(rèn)值為 NULL -- 將憑據(jù)和選項(xiàng)添加到此鏈接服務(wù)器。 exec sp_addlinkedsrvlogin @rmtsrvname = @LinkedServerName ,@useself = 'false' -- 是否通過模擬登錄 or 顯示的提交登錄名和密碼鏈接到遠(yuǎn)程服務(wù)器 ,@rmtuser = @userName -- 登錄名 ,@rmtpassword = @password; -- 密碼 -- 設(shè)置服務(wù)器選項(xiàng) exec sp_serveroption @LinkedServerName, 'rpc', true; -- 從指定的服務(wù)器啟用遠(yuǎn)程過程調(diào)用 (RPC) exec sp_serveroption @LinkedServerName, 'rpc out', true; -- 對指定的服務(wù)器啟用 RPC。 go
執(zhí)行存儲過程
declare @LinkedServerName nvarchar(255) = 'linkName' declare @LinkedServerIP nvarchar(255) = '192.168.3.21' declare @userName nvarchar(255) = 'sa' declare @password nvarchar(255) = '****' -- 執(zhí)行 exec RemoteConnectionServer @LinkedServerName, @LinkedServerIP, @userName, @password -- 測試 SELECT name FROM linkName.master.sys.databases;
方法二:利用SSMS創(chuàng)建鏈接服務(wù)器
下面以鏈接192.168.2.21 SQL Server 服務(wù)器為例:
1 打開SSMS鏈接到本地服務(wù)器
2 選擇服務(wù)器對象–>鏈接服務(wù)器

3 鏈接服務(wù)器 右鍵 新建鏈接服務(wù)器 常規(guī)頁
PS:如果勾選服務(wù)器類型為"SQL Server",則此處’‘鏈接服務(wù)器’'名必須為IP 地址。若選擇"其他數(shù)據(jù)源",此處的鏈接服務(wù)器名作為映射存在(別名), 在數(shù)據(jù)源處填寫IP地址。
當(dāng)然你也可以選擇其他數(shù)據(jù)源去鏈接 SQL Server 服務(wù)器。

4 選擇“安全性”頁

5 選擇 “服務(wù)器選項(xiàng)” 將 RPC 與 RPC Out 設(shè)置為True,默認(rèn)為False。
- RPC
從指定的服務(wù)器啟用遠(yuǎn)程過程調(diào)用 (RPC)。 - RPC Out
對指定的服務(wù)器啟用 RPC。

6 點(diǎn)擊 “確定”,此時(shí)鏈接服務(wù)器目錄下會出現(xiàn)你創(chuàng)建的連接服務(wù)器。
7 右鍵 測試鏈接

successs!

參考鏈接01:sp_addlinkedserver (Transact-SQL) - SQL Server | Microsoft Learn
參考鏈接02:創(chuàng)建鏈接服務(wù)器 - 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 中所有權(quán)和用戶與架構(gòu)的分離
SQL Server 安全性的核心概念是對象的所有者具有管理這些對象的不可撤消的權(quán)限。 你不能刪除對象所有者的特權(quán),并且如果用戶在數(shù)據(jù)庫中擁有對象,你也不能將用戶從此數(shù)據(jù)庫中刪除。
用戶架構(gòu)分離
通過用戶架構(gòu)分離,可實(shí)現(xiàn)管理數(shù)據(jù)庫對象權(quán)限的更大靈活性。 架構(gòu)是一個(gè)適用于數(shù)據(jù)庫對象的命名容器,它使你能夠?qū)ο蠓纸M到單獨(dú)的命名空間中。
用于引用對象的由四部分組成的命名語法指定架構(gòu)名稱。
Server.Database.DatabaseSchema.DatabaseObject
架構(gòu)所有者和權(quán)限
任何數(shù)據(jù)庫主體都可以擁有架構(gòu),并且一個(gè)主體可擁有多個(gè)架構(gòu)。 您可以對架構(gòu)應(yīng)用安全規(guī)則,安全規(guī)則將由架構(gòu)中的所有對象繼承。 如果設(shè)置了對架構(gòu)的訪問權(quán)限,則當(dāng)新對象添加到架構(gòu)時(shí),新對象會自動(dòng)應(yīng)用這些權(quán)限。 可以為用戶分配一個(gè)默認(rèn)的架構(gòu),且多個(gè)數(shù)據(jù)庫用戶可以共享同一架構(gòu)。
默認(rèn)情況下,當(dāng)開發(fā)人員在架構(gòu)中創(chuàng)建對象時(shí),該對象由擁有架構(gòu)的安全主體而不是開發(fā)人員擁有。 可以使用 ALTER AUTHORIZATION Transact-SQL 語句轉(zhuǎn)移對象所有權(quán)。 盡管架構(gòu)還可以包含由不同用戶擁有的對象并且這些對象具有比分配給架構(gòu)的權(quán)限更加細(xì)化的權(quán)限,但因?yàn)榧軜?gòu)會增大管理權(quán)限的復(fù)雜度,因此不建議使用。 對象可以在架構(gòu)之間移動(dòng),架構(gòu)所有權(quán)也可以在主體之間轉(zhuǎn)移。 可以在不影響架構(gòu)的情況下刪除數(shù)據(jù)庫用戶。
實(shí)現(xiàn)后向兼容性的內(nèi)置架構(gòu)
SQL Server 隨附 9 個(gè)預(yù)定義架構(gòu),這些架構(gòu)的名稱與內(nèi)置數(shù)據(jù)庫用戶和角色的名稱相同:db_accessadmin、db_backupoperator、db_datareader、db_datawriter、db_ddladmin、db_denydatareader、db_denydatawriter、db_owner 和 db_securityadmin。 這些架構(gòu)用于實(shí)現(xiàn)后向兼容性。 建議不要將它們用于用戶對象。 可以刪除與固定數(shù)據(jù)庫角色同名的架構(gòu) - 除非它們已被使用,在這種情況下,drop-command 僅返回錯(cuò)誤并阻止刪除已使用的架構(gòu)。 例如:
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]
如果從模型數(shù)據(jù)庫中刪除這些架構(gòu),它們將不會顯示在新數(shù)據(jù)庫中。 不能刪除包含對象的架構(gòu)。
無法刪除以下架構(gòu):
dboguestsysINFORMATION_SCHEMA
sys 和 INFORMATION_SCHEMA 架構(gòu)是為系統(tǒng)對象而保留的。 您不能在這些架構(gòu)中創(chuàng)建對象,而且不能刪除它們。
dbo 架構(gòu)
dbo 架構(gòu)是每個(gè)數(shù)據(jù)庫的默認(rèn)架構(gòu)。 默認(rèn)情況下,使用 CREATE USER Transact-SQL 命令創(chuàng)建的用戶的默認(rèn)架構(gòu)為 dbo。 dbo 架構(gòu)由 dbo 用戶帳戶擁有。
默認(rèn)架構(gòu)被分配為 dbo 的用戶不會繼承 dbo 用戶帳戶的權(quán)限。 用戶不從架構(gòu)繼承權(quán)限;架構(gòu)權(quán)限由架構(gòu)中包含的數(shù)據(jù)庫對象繼承。 用戶的默認(rèn)架構(gòu)僅用于對象引用,以防用戶在查詢對象時(shí)省略架構(gòu)。
當(dāng)使用部分名稱來引用數(shù)據(jù)庫對象時(shí),SQL Server 首先在用戶的默認(rèn)架構(gòu)中查找。 如果在此處未找到該對象,則 SQL Server 其次將在 dbo 架構(gòu)中查找。 如果對象不在 dbo 架構(gòu)中,則會返回一個(gè)錯(cuò)誤。
參考鏈接:SQL Server 中所有權(quán)和用戶與架構(gòu)的分離 - SQL Server | Microsoft Learn
總結(jié)
到此這篇關(guān)于SQL Server跨庫/服務(wù)器查詢及拓展知識點(diǎn)的文章就介紹到這了,更多相關(guān)SQLServer跨庫/服務(wù)器查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MSSQL中進(jìn)行SQL除法運(yùn)算結(jié)果為小數(shù)卻顯示0的解決方法
這篇文章主要介紹了MSSQL中進(jìn)行SQL除法運(yùn)算結(jié)果為小數(shù)卻顯示0的解決方法,需要的朋友可以參考下2015-10-10
如何恢復(fù)SQL Server 2000損壞的數(shù)據(jù)庫文件
在現(xiàn)實(shí)情況中由于硬件和軟件的原因可能導(dǎo)致數(shù)據(jù)庫文件損壞,那么損壞的數(shù)據(jù)庫文件有沒有辦法修復(fù)呢?下面講講如何恢復(fù)SQL Server 2000損壞的數(shù)據(jù)庫文件2014-01-01
SQL語句實(shí)現(xiàn)查詢SQL Server服務(wù)器名稱和IP地址
這篇文章主要介紹了SQL語句實(shí)現(xiàn)查詢SQL Server服務(wù)器名稱和IP地址,本文分別給出查詢語句,需要的朋友可以參考下2015-07-07
SQL報(bào)錯(cuò)注入之updatexml的實(shí)現(xiàn)
updatexml函數(shù)通過輸入不符合XPATH格式的數(shù)據(jù)來觸發(fā)報(bào)錯(cuò),并利用這一點(diǎn)進(jìn)行SQL注入,通過分析報(bào)錯(cuò)信息,可以判斷是否存在注入點(diǎn),并逐步爆出數(shù)據(jù)庫名、表名、字段名以及敏感數(shù)據(jù),感興趣的可以了解一下2024-10-10
sqlserver數(shù)據(jù)庫移動(dòng)數(shù)據(jù)庫路徑的腳本示例
前段時(shí)間做過這么一件事情,把原本放在c盤的所有數(shù)據(jù)庫(除了sql server系統(tǒng)文件外)文件Move到D盤,主要是為了方便后續(xù)管理以及減少磁盤I/O阻塞(C,D是2個(gè)獨(dú)立磁盤)。腳本需輸入2個(gè)參數(shù):目標(biāo)數(shù)據(jù)庫名字和目標(biāo)目錄2013-12-12
數(shù)據(jù)庫 MySQL中文亂碼解決辦法總結(jié)
這篇文章主要介紹了數(shù)據(jù)庫 MySQL中文亂碼解決辦法總結(jié)的相關(guān)資料,數(shù)據(jù)庫保存中文字符,所以經(jīng)常遇到數(shù)據(jù)庫亂碼情況,這里提供了幾種方法,需要的朋友可以參考下2017-03-03
查詢表中某字段有重復(fù)記錄個(gè)數(shù)的方法
本篇文章介紹了,查詢表中某字段有重復(fù)記錄個(gè)數(shù)的方法。需要的朋友參考下2013-04-04
SQL?server創(chuàng)建存儲過程詳細(xì)圖文教程
在SQL中存儲過程類似于編程語言的函數(shù),即當(dāng)創(chuàng)建一個(gè)存儲過程之后便可以在接下來任何類似的操作是直接調(diào)用存儲過程,下面這篇文章主要給大家介紹了關(guān)于SQL?server創(chuàng)建存儲過程的相關(guān)資料,需要的朋友可以參考下2024-01-01

