Sql-Server

如何在 SQL Server 2017 中直接修改系統目錄?

  • December 13, 2017

注意:我了解所涉及的風險,以及這樣做會破壞生產系統的可能性。反正我有興趣去做。

每當我嘗試使用系統目錄時,我都會收到這些奇怪的錯誤,

UPDATE sys.sql_logins
SET password_hash = PWDENCRYPT('pass')
WHERE name = 'sa';

產生的錯誤,

消息 259

$$ … $$ 不允許對系統目錄進行臨時更新。

我嘗試了很多方法來取下訓練輪,

sp_configure 'allow updates',`
go
reconfigure
go

但是,我想不出正確的選擇…

它甚至在這個答案中說:

這不再是可能的(至少除了一個選項****之外,還需要跳過大量額外的障礙sp_configure——這不是你想要在生產系統上做的事情),並且所有系統目錄現在都通過只讀視圖公開像 sys.objects。

好吧,如果我想跳過那些箍怎麼辦。我該怎麼做?

!!   BE SURE TO READ THE WARNING, IN BOLD, AT THE BOTTOM   !!

的伺服器配置選項allow updates從 SQL Server 2005 開始無法使用。文件指出它不會出錯,但實際上不允許對系統目錄表進行任何直接更新。

現在實現這一點的唯一方法是使用專用管理控制台 (DAC) 連接,充分意識到這是危險的並且建議這樣做。

首先,您將需要要更新的*實際表名稱。*您SELECT來自的名稱只是一個系統目錄視圖,而不是真正的表。我通常使用以下內容:

EXEC sp_helptext N'sys.{some name here}';

然後,執行以下操作:

  1. 在單使用者模式下重啟實例
sudo systemctl stop mssql-server
sudo -u mssql /opt/mssql/bin/sqlservr -m

需要明確的是:此步驟是為了允許系統目錄更新。連接到 DAC 本身以執行其他操作不需要單使用者模式。 2. 通過專用管理控制台連接sa或其他sysadmin登錄名進行連接。您可以通過在命令提示符視窗中執行以下命令在 SQLCMD 互動式會話中執行此操作:

sqlcmd -S admin:localhost -U sa

如果 Linux SQLCMD 由於某種原因不支持此功能,您可以啟用遠端 DAC 連接,然後稍後使用 Windows 機器來探勘 DAC 正在工作。您可以通過以下方式在 Linux 上啟用 DAC:

EXEC sp_configure 'remote admin connections', 1;  
RECONFIGURE;  
  1. 在該數據庫中,嘗試以下操作:
UPDATE sys.{whatever_name_you_found} {enter}
SET [some_column] = {some_value} {enter}
WHERE [some_other_column] = {the_better_be_correct_or_else_ID}; {enter}
GO {enter}

在您輸入GO {enter}.

危險將羅賓遜!

**直接編輯系統目錄表時請謹慎,不要對這樣做的想法感到太自在。只有在絕對沒有其他方法可以解決問題時才應該這樣做(例如這裡的案例)。**避免直接編輯可能有幾個原因,但最初想到的兩個原因是:

  • 就像我們創建的數據模型一樣,可能存在一些我們不知道的事情如何工作的規則和工作流程(例如,非規範化、管理跨各種表的數據狀態的“業務”規則等)
  • 如果您遇到問題並簽訂了支持契約(我沒有看到支持協議的條款,但我很難相信這樣的語言不會出現在那裡)。

@Paul Randal在評論中確認:“手動編輯系統表會不可撤銷地在數據庫的引導頁面中設置一個標誌,將您的數據庫標記為已以這種方式編輯,如果您隨後遇到問題,CSS 可能會決定不幫助您用那個數據庫。”

引用自:https://dba.stackexchange.com/questions/192901