如何在 SQL Server 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}';
然後,執行以下操作:
- 在單使用者模式下重啟實例
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;
- 在該數據庫中,嘗試以下操作:
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 可能會決定不幫助您用那個數據庫。”