SQL Server 連結伺服器和遠端統計資訊
我試圖更好地了解 SQL Server 如何使用遠端 SQL Server(例如鍊接伺服器)上的統計資訊。我了解使用者需要 db_owner/db_ddladmin 權限才能使用遠端框上的統計資訊。起初,根據 Microsoft 的以下文本,這似乎非常簡單。
要在連結伺服器上使用表時創建最佳查詢計劃,查詢處理器必須具有來自連結伺服器的數據分佈統計資訊。對錶的任何列具有有限權限的使用者可能沒有足夠的權限來獲取所有有用的統計資訊,並且可能會收到效率較低的查詢計劃並體驗到較差的性能。如果連結伺服器是 SQL Server 的實例,要獲取所有可用的統計資訊,使用者必須擁有該表或者是連結伺服器上 sysadmin 固定伺服器角色、db_owner 固定數據庫角色或 db_ddladmin 固定數據庫角色的成員.
讓我感到困惑的是“使用者”這個詞。我們對所有連接使用標準安全上下文,而不是使用者登錄。此登錄名/使用者具有上述對相關數據庫定義的所需權限。此外,我們不使用模擬。
我嘗試使用在刪除伺服器上具有和不具有提升權限的帳戶在兩端執行查詢並擷取跟踪。在我看來,除非實際使用者(鍵盤上的那個人)具有提升的權限,否則遠端伺服器不會收集統計資訊。我相信這是真的,因為我只在使用者擁有所需權限時才看到對 sys.sp_table_statistics2_rowset 的呼叫。
我真的希望這是有道理的。
有沒有人了解這在 SQL 2008 R2 及更低版本中是如何工作的?
我所做的是這個“技巧”:
給這個 ’linkuser’ 讀取,無論其他需要什麼和
ddl_admin
權限,然後執行以下腳本以確保ddl_admin
實際上不能使用任何權限。但是,作為使用者的技術成員,
ddl_admin
現在可以在遠端數據庫中查看統計資訊!(注意:從 SQL2012SP1 開始,不需要這個 hack,統計數據應該是可見的)DENY CREATE TABLE TO [LinkUser] DENY CREATE VIEW TO [LinkUser] DENY CREATE PROCEDURE TO [LinkUser] DENY CREATE FUNCTION TO [LinkUser] DENY CREATE RULE TO [LinkUser] DENY CREATE DEFAULT TO [LinkUser] DENY CREATE TYPE TO [LinkUser] DENY CREATE ASSEMBLY TO [LinkUser] DENY CREATE XML SCHEMA COLLECTION TO [LinkUser] DENY CREATE SCHEMA TO [LinkUser] DENY CREATE SYNONYM TO [LinkUser] DENY CREATE AGGREGATE TO [LinkUser] DENY CREATE MESSAGE TYPE TO [LinkUser] DENY CREATE SERVICE TO [LinkUser] DENY CREATE CONTRACT TO [LinkUser] DENY CREATE REMOTE SERVICE BINDING TO [LinkUser] DENY CREATE ROUTE TO [LinkUser] DENY CREATE QUEUE TO [LinkUser] DENY CREATE SYMMETRIC KEY TO [LinkUser] DENY CREATE ASYMMETRIC KEY TO [LinkUser] DENY CREATE FULLTEXT CATALOG TO [LinkUser] DENY CREATE CERTIFICATE TO [LinkUser] DENY CREATE DATABASE DDL EVENT NOTIFICATION TO [LinkUser] DENY CHECKPOINT TO [LinkUser] DENY ALTER ANY SCHEMA TO [LinkUser] DENY ALTER ANY ASSEMBLY TO [LinkUser] DENY ALTER ANY DATASPACE TO [LinkUser] DENY ALTER ANY MESSAGE TYPE TO [LinkUser] DENY ALTER ANY CONTRACT TO [LinkUser] DENY ALTER ANY SERVICE TO [LinkUser] DENY ALTER ANY REMOTE SERVICE BINDING TO [LinkUser] DENY ALTER ANY ROUTE TO [LinkUser] DENY ALTER ANY FULLTEXT CATALOG TO [LinkUser] DENY ALTER ANY SYMMETRIC KEY TO [LinkUser] DENY ALTER ANY ASYMMETRIC KEY TO [LinkUser] DENY ALTER ANY CERTIFICATE TO [LinkUser] DENY REFERENCES TO [LinkUser] DENY ALTER ANY DATABASE DDL TRIGGER TO [LinkUser] DENY ALTER ANY DATABASE EVENT NOTIFICATION TO [LinkUser]