web-dev-qa-db-ja.com

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などの読み取り専用ビューを通じて公開されます。

さて、私がそれらのフープを飛び越えたいとしたらどうでしょう。どうすればできますか?

6
Evan Carroll

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

SQL Server 2005以降、allow updatesのサーバー構成オプションは機能しなくなりました。ドキュメントには、エラーは発生しないと記載されていますが、実際にはシステムカタログテーブルへの直接更新は許可されていません。

これを実現する唯一の方法は、これを十分に理解しているIS DANGEROUS AND IS[〜#〜]ではありません[〜#〜]RECOMMENDED専用管理コンソール(DAC)接続 を使用することです。

まず、更新するactualテーブル名が必要です。 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;  
    
  3. そのDBで、次のようなことを試してください。

    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}を入力するまで、ステートメントは実行されません。

危険がロビンソンになります!!

システムカタログテーブルを直接編集する場合は注意が必要です。また、編集することに慣れすぎないようにしてください。これは、問題を修正する方法が他に絶対にない場合のみです(ここの場合など)。直接編集を行わない理由はおそらくいくつかありますが、最初に思い浮かぶのは次の2つです。

  • 私たちが作成するデータモデルと同様に、私たちが認識していないものの動作方法に関するルールとワークフローが存在する可能性があります(非正規化、さまざまなテーブルのデータの状態を管理する「ビジネス」ルールなど)
  • 直接編集を行うと、問題が発生してサポート契約を結んだ場合にマイクロソフトを支援する責任が失われる可能性があります(サポート契約の条件は確認していませんが、そのような言語はそこ)。

    @ Paul Randal コメントで確認:「システムテーブルを手動で編集すると、データベースのブートページにデータベースがこのように編集されたことを示すフラグが設定され、CSSはこれを行わない場合があります。その後、そのデータベースに問題が発生した場合に役立ちます。」

10
Solomon Rutzky

短い答え:そうではありません。

より長い回答:本番システムでは絶対に行わないでくださいであることに注意してください。あなたはかなり悪いことに混乱する可能性があり、おそらく混乱します。サポートされていない/文書化されていないすべての混乱について助けを求める場合、MSは砂を叩くように指示します。

これで、これで終わりです。

まず、SQL Serverをシングルユーザーモードで起動する必要があります。 「linux」という質問にタグを付けましたが、これがまったく同じように機能するかどうかはわかりませんが、Windowsバージョンの場合は、SQL Serverサービスを停止し、コマンドラインから「-m」を使用して起動します。引数、例えば:

_cd "\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn"
sqlservr.exe -m
_

それが実行されたら、インスタンスの専用管理者接続(DAC)に接続する必要があります。好きなツールを使用できます。 Management Studioまたはsqlcmd。ただし、オブジェクトエクスプローラーはシングルユーザーモードで実行されているため、Management Studioで接続できないことに注意してください。どちらの場合も、サーバー名に_ADMIN:_プレフィックスを指定します。 ADMIN:(local)を実行して、ローカルのデフォルトインスタンスに接続できると思います。

その後、必要なものをほとんど変更できますが、特定のシステムカタログビューの実際の基になるテーブルを把握する必要があります。たとえば、_sys.database_principals_です。ビューの定義を確認するには、「mssqlsystemresource」データベース(通常は表示されません)に切り替え、_sp_helptext_を使用してシステムビュー/プロシージャ/関数のコードを確認します。

_USE mssqlsystemresource
GO
EXEC sp_helptext 'sys.server_principals'
_

このビューが参照するテーブルの1つが_master.sys.sysxlgns_であることがわかります。このテーブルにはpwdhashという名前の列があり、ハッシュされたパスワードを格納しているようです。

調整が終わったら、SQL Serverをシングルユーザーモードで実行しているコマンドウィンドウに移動し、Ctrl-Cを押してシャットダウンします。

覚えておいてくださいMicrosoftサポートから特別な指示がない限り、これを運用システムで実行しないでください。それ以外は、楽しんで、インスタンスを破壊するときのバックアップがあることを確認してください!

4
db2