Bagaimana cara memberi diri saya akses admin ke contoh SQL Server lokal?

93

Saya menginstal SQL Server 2008 R2 ke komputer lokal saya. Tapi, saya tidak bisa membuat database baru karena hak (atau kurangnya).

"BUAT IZIN DATABASE DITOLAK"

Jadi, saya mencoba menetapkan hak istimewa admin ke login saya saat ini

"Pengguna tidak memiliki izin untuk melakukan tindakan ini."

Saya juga mencoba membuat login baru yang akan memiliki hak istimewa admin tetapi tidak berhasil. Bagaimana cara memberikan hak admin kepada diri saya sendiri sehingga saya dapat membuat database? Saya dapat menginstal ulang, tetapi saya memilih untuk tidak melakukannya.

SkonJeet
sumber
1
Apakah Anda mencoba menyambung melalui autentikasi SQL Server atau Autentikasi Windows?
Darren
Otentikasi Windows (lihat judul). Saya berhasil tersambung. Kesalahan terjadi saat mencoba melakukan tugas admin.
SkonJeet

Jawaban:

70

Ya - sepertinya Anda lupa menambahkan diri Anda ke peran sysadmin saat menginstal SQL Server. Jika Anda adalah administrator lokal di komputer Anda, posting blog ini dapat membantu Anda menggunakan SQLCMD untuk memasukkan akun Anda ke grup sysadmin SQL Server tanpa harus menginstal ulang. Ini sedikit celah keamanan di SQL Server, jika Anda bertanya kepada saya, tetapi itu akan membantu Anda dalam kasus ini.

Brian Knight
sumber
15
Ini bukan lubang keamanan, administrator lokal harus memiliki hak ke server sql, pada kenyataannya administrator lokal tetap dapat mengakses data server sql dengan menyalin file data ke komputer lain (dan kemudian menyalin kembali jika diperlukan), jadi satu-satunya cara Anda untuk menyiasatinya adalah dengan membatasi izin administratif hanya untuk mereka yang berhak menerimanya ..
yoel halb
ITU seharusnya lebih mudah daripada uninstall / install ulang? Hampir tidak! Dalam kasus saya, kami bermigrasi ke domain lain; semua login yang ada tidak berharga.
dudeNumber4
8
Tautan sudah mati (dan jawaban hanya tautan tidak disarankan). stackoverflow.com/a/9889484/389424 memiliki instruksi yang sama dengan entri blog asli
janv8000
82

Buka jendela prompt perintah. Jika Anda memiliki contoh default SQL Server yang sudah berjalan, jalankan perintah berikut pada prompt perintah untuk menghentikan layanan SQL Server:

net stop mssqlserver

Sekarang masuk ke direktori tempat SQL server diinstal. Direktori dapat misalnya menjadi salah satu dari ini:

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn
C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn

Cari tahu direktori MSSQL Anda dan CDke dalamnya seperti ini:

CD C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn

Sekarang jalankan perintah berikut untuk memulai SQL Server dalam mode pengguna tunggal. Seperti SQLCMDyang ditentukan, hanya satu SQLCMDkoneksi yang dapat dibuat (dari jendela prompt perintah lain).

sqlservr -m"SQLCMD"

Sekarang, buka jendela prompt perintah lain sebagai pengguna yang sama dengan yang memulai SQL Server dalam mode pengguna tunggal di atas, dan di dalamnya, jalankan:

sqlcmd

Dan tekan enter. Sekarang Anda dapat menjalankan pernyataan SQL terhadap contoh SQL Server yang berjalan dalam mode pengguna tunggal:

create login [<<DOMAIN\USERNAME>>] from windows;

-- For older versions of SQL Server:
EXEC sys.sp_addsrvrolemember @loginame = N'<<DOMAIN\USERNAME>>', @rolename = N'sysadmin';

-- For newer versions of SQL Server:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];

GO

Sumber .

DIPERBARUI Jangan lupa titik koma setelahnya ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];dan jangan tambahkan titik koma ekstra setelah GOatau perintah tidak pernah dijalankan.

Darren
sumber
Catatan singkat bahwa sp_addsrvrolemember telah digantikan oleh ALTER SERVER ROLE. misalnyaALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin
Jangan lupa untuk menambahkan GO;di bagian akhir
NMrt
Mengingat banyak dari kita sekarang menjalankan SQL Server tanpa SSMS, saya merasa ini adalah jawaban yang jauh lebih baik.
Chaim Eliyah
39

Saya mengadopsi database SQL 2012 di mana saya bukan sysadmin tetapi sebagai administrator di mesin. Saya menggunakan SSMS dengan "Run as Administrator", menambahkan akun NT saya sebagai login SQL dan mengatur peran server ke sysadmin. Tidak masalah.

Vince P.
sumber
14
Solusi ini berhasil untuk saya, dengan satu langkah tambahan yang diperlukan: Harus memulai sql server dalam mode pengguna tunggal dengan menambahkan tanda "-m". Ini dapat dilakukan dengan menggunakan "SQL Server Configuration Manager", klik kanan instance server dan pilih properti, buka tab "Parameter Startup" dan tambahkan -m.
maets
Ini luar biasa. Jauh lebih sederhana dari jawaban lainnya.
McKay
1
Pasti jawaban tercepat dan terbaik dari semua
Johnny
Cukup mudah dan berfungsi seperti pesona. Terima kasih Vince dan maets.
Edgar Salazar
1
Ini sebenarnya jawaban yang benar. Satu catatan, untuk mendapatkan SQL dalam mode pengguna tunggal saya harus menjalankan> net stop MSSQL $ SQLEXPRESS dan kemudian> mulai bersih MSSQL $ SQLEXPRESS / m
Ev.
29

Berikut skrip yang mengklaim dapat memperbaiki ini.

Dapatkan hak admin ke SQL Server Express lokal Anda dengan skrip sederhana ini

Unduh tautan ke skrip

Deskripsi

Skrip perintah ini memungkinkan Anda dengan mudah menambahkan diri Anda sendiri ke peran sysadmin dari instance SQL Server lokal. Anda harus menjadi anggota grup Administrator lokal Windows, atau memiliki akses ke kredensial pengguna yang. Skrip mendukung SQL Server 2005 dan yang lebih baru.

Skrip ini sangat berguna jika Anda adalah pengembang yang mencoba menggunakan SQL Server 2008 Express yang diinstal oleh orang lain. Dalam situasi ini Anda biasanya tidak akan memiliki hak admin untuk contoh SQL Server 2008 Express, karena secara default hanya orang yang menginstal SQL Server 2008 yang diberikan hak administratif.

Pengguna yang menginstal SQL Server 2008 Express dapat menggunakan SQL Server Management Studio untuk memberikan hak istimewa yang diperlukan kepada Anda. Tetapi bagaimana jika SQL Server Management Studio tidak diinstal? Atau lebih buruk jika pengguna yang menginstal tidak tersedia lagi?

Skrip ini memperbaiki masalah hanya dengan beberapa klik!

Catatan: Anda harus memberikan file BAT dengan 'Nama Instance' (Mungkin akan menjadi 'MSSQLSERVER' - tetapi mungkin tidak): Anda bisa mendapatkan nilainya dengan terlebih dahulu menjalankan perintah berikut di "Microsoft SQL Server Management Console ":

 SELECT @@servicename

Kemudian salin hasilnya untuk digunakan saat file BAT meminta 'SQL instance name'.

  @echo off 
    rem 
    rem **************************************************************************** 
    rem 
    rem    Copyright (c) Microsoft Corporation. All rights reserved. 
    rem    This code is licensed under the Microsoft Public License. 
    rem    THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 
    rem    ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY 
    rem    IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR 
    rem    PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. 
    rem 
    rem **************************************************************************** 
    rem 
    rem CMD script to add a user to the SQL Server sysadmin role 
    rem 
    rem Input:  %1 specifies the instance name to be modified. Defaults to SQLEXPRESS. 
    rem         %2 specifies the principal identity to be added (in the form "<domain>\<user>"). 
    rem            If omitted, the script will request elevation and add the current user (pre-elevation) to the sysadmin role. 
    rem            If provided explicitly, the script is assumed to be running elevated already. 
    rem 
    rem Method: 1) restart the SQL service with the '-m' option, which allows a single connection from a box admin 
    rem            (the box admin is temporarily added to the sysadmin role with this start option) 
    rem         2) connect to the SQL instance and add the user to the sysadmin role 
    rem         3) restart the SQL service for normal connections 
    rem 
    rem Output: Messages indicating success/failure. 
    rem         Note that if elevation is done by this script, a new command process window is created: the output of this 
    rem         window is not directly accessible to the caller. 
    rem 
    rem 
    setlocal 
    set sqlresult=N/A 
    if .%1 == . (set /P sqlinstance=Enter SQL instance name, or default to SQLEXPRESS: ) else (set sqlinstance=%1) 
    if .%sqlinstance% == . (set sqlinstance=SQLEXPRESS) 
    if /I %sqlinstance% == MSSQLSERVER (set sqlservice=MSSQLSERVER) else (set sqlservice=MSSQL$%sqlinstance%) 
    if .%2 == . (set sqllogin="%USERDOMAIN%\%USERNAME%") else (set sqllogin=%2) 
    rem remove enclosing quotes 
    for %%i in (%sqllogin%) do set sqllogin=%%~i 
    @echo Adding '%sqllogin%' to the 'sysadmin' role on SQL Server instance '%sqlinstance%'. 
    @echo Verify the '%sqlservice%' service exists ... 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto existerror 
    rem 
    rem elevate if <domain/user> was defaulted 
    rem 
    if NOT .%2 == . goto continue 
    echo new ActiveXObject("Shell.Application").ShellExecute("cmd.exe", "/D /Q /C pushd \""+WScript.Arguments(0)+"\" & \""+WScript.Arguments(1)+"\" %sqlinstance% \""+WScript.Arguments(2)+"\"", "", "runas"); >"%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    call "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" "%cd%" %0 "%sqllogin%" 
    del "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    goto :EOF 
    :continue 
    rem 
    rem determine if the SQL service is running 
    rem 
    set srvstarted=0 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    rem 
    rem if required, stop the SQL service 
    rem 
    if .%srvstate% == .1 goto startm 
    set srvstarted=1 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    :startm 
    rem 
    rem start the SQL service with the '-m' option (single admin connection) and wait until its STATE is '4' (STARTED) 
    rem also use trace flags as follows: 
    rem     3659 - log all errors to errorlog 
    rem     4010 - enable shared memory only (lpc:) 
    rem     4022 - do not start autoprocs 
    rem 
    @echo Start the '%sqlservice%' service in maintenance mode ... 
    sc start %sqlservice% -m -T3659 -T4010 -T4022 >nul 
    if errorlevel 1 goto startmerror 
    :checkstate1 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    if .%srvstate% == .1 goto startmerror 
    if NOT .%srvstate% == .4 goto checkstate1 
    rem 
    rem add the specified user to the sysadmin role 
    rem access tempdb to avoid a misleading shutdown error 
    rem 
    @echo Add '%sqllogin%' to the 'sysadmin' role ... 
    for /F "usebackq tokens=1,3" %%i in (`sqlcmd -S np:\\.\pipe\SQLLocal\%sqlinstance% -E -Q "create table #foo (bar int); declare @rc int; execute @rc = sp_addsrvrolemember '$(sqllogin)', 'sysadmin'; print 'RETURN_CODE : '+CAST(@rc as char)"`) do if .%%i == .RETURN_CODE set sqlresult=%%j 
    rem 
    rem stop the SQL service 
    rem 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    if .%srvstarted% == .0 goto exit 
    rem 
    rem start the SQL service for normal connections 
    rem 
    net start %sqlservice% 
    if errorlevel 1 goto starterror 
    goto exit 
    rem 
    rem handle unexpected errors 
    rem 
    :existerror 
    sc query %sqlservice% 
    @echo '%sqlservice%' service is invalid 
    goto exit 
    :queryerror 
    @echo 'sc query %sqlservice%' failed 
    goto exit 
    :stoperror 
    @echo 'net stop %sqlservice%' failed 
    goto exit 
    :startmerror 
    @echo 'sc start %sqlservice% -m' failed 
    goto exit 
    :starterror 
    @echo 'net start %sqlservice%' failed 
    goto exit 
    :exit 
    if .%sqlresult% == .0 (@echo '%sqllogin%' was successfully added to the 'sysadmin' role.) else (@echo '%sqllogin%' was NOT added to the 'sysadmin' role: SQL return code is %sqlresult%.) 
    endlocal 
    pause
Chris Gessler
sumber
2
Bekerja untuk saya. Satu hal yang perlu diingat, pastikan Anda memiliki ekstensi .js yang dipetakan ke Microsoft ® Windows Based Script Hostvoodoo ini jika tidak, ini tidak akan berfungsi (saya telah memetakan milik saya ke notepad.exe).
Phil Cooper
2
Link sudah mati - "Galeri Arsip telah dihentikan".
mulai
3
@stuartd - menambahkan skrip
Chris Gessler
jika Anda menghadapi masalah menambahkan diri Anda sebagai admin menggunakan skrip di atas. Coba tambahkan login Anda ke database, lalu jalankan skrip.
Ram
2
Seseorang menambahkan ini ke GitHub. Skrip ini adalah penghemat waktu nyata. gist.github.com/wadewegner/1677788
Patrick
6

Microsoft memiliki artikel tentang masalah ini. Itu melewati semuanya selangkah demi selangkah.

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/connect-to-sql-server-when-system-administrators-are-locked-out

Singkatnya, ini melibatkan memulai instance sqlserver dengan -mseperti semua jawaban lain yang disarankan. Namun Microsoft memberikan instruksi yang sedikit lebih rinci.

Dari halaman Mulai, mulai SQL Server Management Studio. Pada menu View, pilih Registered Server. (Jika server Anda belum terdaftar, klik kanan Grup Server Lokal, arahkan ke Tugas, lalu klik Daftarkan Server Lokal.)

Di area Server Terdaftar, klik kanan server Anda, lalu klik Manajer Konfigurasi Server SQL. Ini harus meminta izin untuk menjalankan sebagai administrator, dan kemudian membuka program Pengelola Konfigurasi.

Tutup Studio Manajemen.

Di Manajer Konfigurasi Server SQL, di panel kiri, pilih Layanan SQL Server. Di panel kanan, temukan instance SQL Server Anda. (Contoh default SQL Server menyertakan (MSSQLSERVER) setelah nama komputer. Contoh bernama muncul dalam huruf besar dengan nama yang sama yang mereka miliki di Server Terdaftar.) Klik kanan contoh SQL Server, dan kemudian klik Properti.

Pada tab Parameter Startup, di kotak Tentukan parameter startup, ketik -m dan kemudian klik Add. (Itu setrip lalu huruf kecil m.)

Catatan

Untuk beberapa versi SQL Server sebelumnya, tidak ada tab Parameter Startup. Dalam kasus tersebut, pada tab Advanced, klik dua kali Parameter Startup. Parameter terbuka di jendela yang sangat kecil. Berhati-hatilah untuk tidak mengubah parameter yang ada. Di bagian paling akhir, tambahkan parameter baru; -m lalu klik OK. (Itu titik koma lalu tanda hubung lalu huruf kecil m.)

Klik OK, dan setelah pesan untuk restart, klik kanan nama server Anda, dan kemudian klik Restart.

Setelah SQL Server dimulai ulang, server Anda akan berada dalam mode pengguna tunggal. Pastikan bahwa Agen Server SQL tidak berjalan. Jika dimulai, itu akan mengambil satu-satunya koneksi Anda.

Di layar mulai Windows 8, klik kanan ikon untuk Studio Manajemen. Di bagian bawah layar, pilih Jalankan sebagai administrator. (Ini akan meneruskan kredensial administrator Anda ke SSMS.)

Catatan

Untuk versi Windows sebelumnya, opsi Jalankan sebagai administrator muncul sebagai sub-menu.

Dalam beberapa konfigurasi, SSMS akan mencoba membuat beberapa koneksi. Beberapa koneksi akan gagal karena SQL Server dalam mode pengguna tunggal. Anda dapat memilih salah satu tindakan berikut untuk dilakukan. Lakukan salah satu dari berikut ini.

a) Terhubung dengan Object Explorer menggunakan Windows Authentication (yang menyertakan kredensial Administrator Anda). Perluas Keamanan, luaskan Login, dan klik dua kali login Anda sendiri. Di halaman Server Roles, pilih sysadmin, lalu klik OK.

b) Alih-alih menghubungkan dengan Object Explorer, hubungkan dengan Jendela Kueri menggunakan Otentikasi Windows (yang menyertakan kredensial Administrator Anda). (Anda hanya dapat menyambung dengan cara ini jika Anda tidak terhubung dengan Object Explorer.) Jalankan kode seperti berikut ini untuk menambahkan login Otentikasi Windows baru yang merupakan anggota dari peran server tetap sysadmin. Contoh berikut menambahkan pengguna domain bernama CONTOSO \ PatK.

CREATE LOGIN [CONTOSO\PatK] FROM WINDOWS;   ALTER SERVER ROLE
sysadmin ADD MEMBER [CONTOSO\PatK];   

c) Jika SQL Server Anda berjalan dalam mode otentikasi campuran, hubungkan dengan Jendela Kueri menggunakan Otentikasi Windows (yang menyertakan kredensial Administrator Anda). Jalankan kode seperti berikut ini untuk membuat login otentikasi SQL Server baru yang merupakan anggota dari peran server tetap sysadmin.

CREATE LOGIN TempLogin WITH PASSWORD = '************';   ALTER
SERVER ROLE sysadmin ADD MEMBER TempLogin;   

Peringatan:

Ganti ************ dengan kata sandi yang kuat.

d) Jika SQL Server Anda berjalan dalam mode otentikasi campuran dan Anda ingin mengatur ulang kata sandi akun sa, hubungkan dengan Jendela Kueri menggunakan Otentikasi Windows (yang menyertakan kredensial Administrator Anda). Ubah kata sandi akun sa dengan sintaks berikut.

ALTER LOGIN sa WITH PASSWORD = '************';   Warning

Ganti ************ dengan kata sandi yang kuat.

Langkah-langkah berikut sekarang mengubah SQL Server kembali ke mode multi-pengguna. Tutup SSMS.

Di Manajer Konfigurasi Server SQL, di panel kiri, pilih Layanan SQL Server. Di panel kanan, klik kanan contoh SQL Server, dan kemudian klik Properti.

Pada tab Parameter Startup, di kotak Parameter yang ada, pilih -m dan kemudian klik Hapus.

Catatan

Untuk beberapa versi SQL Server sebelumnya, tidak ada tab Parameter Startup. Dalam kasus tersebut, pada tab Advanced, klik dua kali Parameter Startup. Parameter terbuka di jendela yang sangat kecil. Hapus; -m yang Anda tambahkan sebelumnya, dan kemudian klik OK.

Klik kanan nama server Anda, dan kemudian klik Restart.

Sekarang Anda seharusnya dapat terhubung secara normal dengan salah satu akun yang sekarang menjadi anggota dari peran server tetap sysadmin.

Yair Halberstadt
sumber
2

Ini sebenarnya cukup untuk menambahkan -m ke parameter startup di Sql Server Configuration Manager, restart layanan, pergi ke ssms dan tambahkan kotak centang sysadmin di akun Anda, lalu hapus -m restart lagi dan gunakan seperti biasa.

Opsi Startup Layanan Database Engine

-m Memulai contoh SQL Server dalam mode pengguna tunggal.

norbertas.gaulia
sumber