!! PASTIKAN UNTUK MEMBACA PERINGATAN, DI BOLD, DI BAWAH!!
Opsi konfigurasi server allow updates
dirender non-fungsional mulai dari SQL Server 2005. Dokumentasi menyatakan bahwa itu tidak salah, tetapi sebenarnya tidak mengizinkan pembaruan langsung apa pun ke tabel katalog sistem.
Satu-satunya cara untuk mencapainya sekarang, SEPENUHNYA MENYADARI BAHWA INI BERBAHAYA DAN TIDAK DIREKOMENDASIKAN , adalah menggunakan koneksi Konsol Admin Khusus (DAC).
Pertama, Anda membutuhkan aktual Nama tabel yang ingin Anda perbarui. Nama yang Anda SELECT
from hanyalah Tampilan katalog sistem, bukan Tabel sebenarnya. Saya biasanya menggunakan yang berikut ini:
EXEC sp_helptext N'sys.{some name here}';
Kemudian, lakukan hal berikut:
-
Mulai ulang instance dalam mode Pengguna Tunggal dengan
sudo systemctl stop mssql-server sudo -u mssql /opt/mssql/bin/sqlservr -m
Hanya untuk memperjelas:langkah ini untuk memungkinkan pembaruan katalog sistem. Menghubungkan ke DAC itu sendiri untuk melakukan operasi lain tidak memerlukan mode Pengguna Tunggal.
-
Terhubung melalui koneksi Konsol Admin Khusus dengan
sa
atausysadmin
lainnya Gabung. Anda dapat melakukan ini dalam sesi interaktif SQLCMD dengan menjalankan perintah berikut di jendela Prompt Perintah:sqlcmd -S admin:localhost -U sa
Jika Linux SQLCMD tidak mendukung ini karena beberapa alasan, Anda dapat mengaktifkan koneksi DAC jarak jauh dan kemudian menggunakan mesin Windows untuk mengetahui apakah DAC berfungsi. Anda dapat mengaktifkan DAC di Linux dengan,:
EXEC sp_configure 'remote admin connections', 1; RECONFIGURE;
-
Di DB itu, coba sesuatu seperti berikut:
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}
Itu tidak akan mengeksekusi pernyataan sampai Anda memasukkan
GO {enter}
.
BAHAYA AKAN ROBINSON!!
Harap berhati-hati saat mengedit tabel katalog sistem secara langsung, dan jangan terlalu nyaman dengan ide melakukannya. Ini adalah sesuatu yang harus dilakukan hanya jika sama sekali tidak ada cara lain untuk memperbaiki masalah (seperti kasus di sini). Mungkin ada beberapa alasan untuk menghindari pengeditan langsung, tetapi dua alasan pertama yang muncul di benak Anda adalah:
- Sama seperti model data yang kami buat, kemungkinan ada aturan dan alur kerja tentang cara kerja berbagai hal yang tidak kami ketahui (mis. denormalisasi, aturan "bisnis" yang mengatur status data di berbagai tabel, dll.)
-
Kemungkinan besar melakukan pengeditan langsung membatalkan tanggung jawab Microsoft untuk membantu Anda jika Anda mengalami masalah dan memiliki kontrak dukungan (saya belum melihat persyaratan perjanjian Dukungan), tetapi saya sulit percaya bahwa bahasa seperti itu tidak akan ada di di sana).
@Paul Randal mengonfirmasi dalam komentar:"mengedit tabel sistem secara manual tidak dapat ditarik kembali menetapkan bendera di halaman boot database yang menandai database Anda telah diedit dengan cara ini, dan CSS mungkin memutuskan untuk tidak membantu Anda jika nanti Anda mengalami masalah dengan basis data itu."
Jawaban singkat:Anda tidak.
Jawaban yang lebih panjang:Perhatikan bahwa Anda jangan pernah melakukan ini pada sistem produksi . Anda dapat dan kemungkinan besar akan mengacaukan segalanya, dan MS akan meminta Anda untuk menumbuk pasir jika Anda menelepon mereka untuk meminta bantuan dengan semua masalah Anda yang tidak didukung/tidak didokumentasikan.
Dengan menyingkir, ini dia.
Pertama, Anda harus mengaktifkan SQL Server dalam mode pengguna tunggal. Anda telah menandai pertanyaan "linux", dan saya tidak tahu apakah ini bekerja dengan cara yang persis sama, tetapi untuk versi Windows, hentikan saja layanan SQL Server, lalu luncurkan dari baris perintah dengan "-m" argumen, misalnya:
cd "\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn"
sqlservr.exe -m
Setelah itu berjalan, Anda harus terhubung ke koneksi administrator khusus (DAC) untuk instance. Anda dapat menggunakan alat apa pun yang Anda suka, mis. Management Studio atau sqlcmd, tetapi perhatikan bahwa Anda tidak dapat menghubungkan Object Explorer di Management Studio, karena ini berjalan dalam mode pengguna tunggal. Dalam kedua kasus tersebut, tentukan ADMIN:
awalan untuk nama server. Saya pikir Anda dapat melakukan ADMIN:(local)
untuk terhubung ke instance default lokal.
Setelah itu, Anda dapat mengubah apa yang Anda inginkan, tetapi Anda harus mencari tahu tabel dasar sebenarnya untuk tampilan katalog sistem tertentu. Misalnya, sys.database_principals
. Untuk melihat definisi tampilan, alihkan ke database "mssqlsystemresource" (biasanya tidak terlihat), dan gunakan sp_helptext
untuk melihat kode untuk tampilan/prosedur/fungsi sistem apa pun.
USE mssqlsystemresource
GO
EXEC sp_helptext 'sys.server_principals'
Anda akan melihat salah satu tabel yang dirujuk tampilan ini adalah master.sys.sysxlgns
, yang mungkin merupakan tempat yang baik untuk memulai. Anda akan menemukan kolom bernama pwdhash
di tabel ini, yang tampaknya menyimpan kata sandi hash.
Setelah selesai mengotak-atik, cukup buka jendela perintah yang menjalankan SQL Server dalam mode pengguna tunggal dan tekan Ctrl-C untuk mematikannya.
Ingat, jangan pernah lakukan ini pada sistem produksi, kecuali jika dukungan Microsoft telah memberi Anda petunjuk khusus . Selain itu, bersenang-senanglah, dan pastikan Anda memiliki cadangan untuk saat Anda merusak instans!