Come posso concedermi l'accesso amministrativo a un'istanza di SQL Server locale?


92

Ho installato SQL Server 2008 R2 sulla mia macchina locale. Ma non posso creare un nuovo database a causa dei diritti (o della mancanza di).

"CREATE DATABASE AUTORIZZAZIONE NEGATA"

Quindi, ho provato ad assegnare i privilegi di amministratore al mio login attuale

"L'utente non dispone dell'autorizzazione per eseguire questa azione."

Ho anche provato a creare un nuovo login che avrebbe privilegi di amministratore ma senza fortuna. Come mi concedo i diritti di amministratore in modo da poter creare un database? Posso reinstallare, ma preferisco non farlo.


1
Stai tentando di connetterti tramite l'autenticazione di SQL Server o l'autenticazione di Windows?
Darren

Autenticazione di Windows (vedi titolo). Mi sto connettendo con successo. Gli errori provengono dal tentativo di eseguire attività di amministrazione.
SkonJeet

Risposte:


70

Sì, sembra che ti sia dimenticato di aggiungere te stesso al ruolo di amministratore di sistema durante l'installazione di SQL Server. Se sei un amministratore locale della tua macchina, questo post del blog può aiutarti a utilizzare SQLCMD per inserire il tuo account nel gruppo sysadmin di SQL Server senza dover reinstallare. È un po 'un buco di sicurezza in SQL Server, se me lo chiedi, ma ti aiuterà in questo caso.


15
Non è una falla di sicurezza, gli amministratori locali devono avere i diritti sul server sql, infatti un amministratore locale sarebbe comunque in grado di accedere ai dati del server sql copiando i file di dati su un'altra macchina (e quindi copiandoli se necessario), quindi l'unico modo per aggirare questo è limitare le autorizzazioni amministrative solo a coloro che se lo meritano ..
yoel halb

QUELLO dovrebbe essere più facile della disinstallazione / reinstallazione? Difficilmente! Nel mio caso, siamo stati migrati su un altro dominio; tutti gli accessi esistenti sono inutili.
dudeNumber4

8
Il collegamento è morto (e le risposte di solo collegamento sono scoraggiate). stackoverflow.com/a/9889484/389424 ha le stesse istruzioni del post del blog originale
janv8000

81

Apri una finestra del prompt dei comandi. Se hai già un'istanza predefinita di SQL Server in esecuzione, esegui il seguente comando nel prompt dei comandi per arrestare il servizio SQL Server:

net stop mssqlserver

Ora vai alla directory in cui è installato SQL Server. La directory può ad esempio essere una di queste:

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

Scopri la tua directory MSSQL e CDin essa come tale:

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

Ora esegui il seguente comando per avviare SQL Server in modalità utente singolo. Come SQLCMDspecificato, è SQLCMDpossibile effettuare una sola connessione (da un'altra finestra del prompt dei comandi).

sqlservr -m"SQLCMD"

Ora, apri un'altra finestra del prompt dei comandi con lo stesso utente di quella che ha avviato SQL Server in modalità utente singolo sopra e, in essa, esegui:

sqlcmd

E premi invio. Ora puoi eseguire istruzioni SQL sull'istanza di SQL Server in esecuzione in modalità utente singolo:

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

Fonte .

AGGIORNATO Non dimenticare un punto ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];e virgola dopo e non aggiungere altro punto GOe virgola dopo o il comando non viene mai eseguito.


Nota rapida che sp_addsrvrolemember è stato sostituito da ALTER SERVER ROLE. ad esempioALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin

Non dimenticare di aggiungere GO;alla fine
NMrt

Dato che molti di noi ora eseguono SQL Server senza SSMS, ritengo che questa sia una risposta molto migliore.
Chaim Eliyah

38

Ho adottato un database SQL 2012 in cui non ero un amministratore di sistema ma un amministratore della macchina. Ho usato SSMS con "Esegui come amministratore", ho aggiunto il mio account NT come login SQL e ho impostato il ruolo del server su sysadmin. Nessun problema.


14
Questa soluzione ha funzionato per me, con un passaggio aggiuntivo richiesto: ho dovuto avviare il server sql in modalità utente singolo aggiungendo il flag "-m". Questa operazione può essere eseguita utilizzando "SQL Server Configuration Manager", fare clic con il pulsante destro del mouse sull'istanza del server e selezionare proprietà, andare alla scheda "Parametri di avvio" e aggiungere -m.
arrivo

Questo e spettacolare. Molto più semplice delle altre risposte.
McKay

Sicuramente la risposta più veloce e migliore di tutte
Johnny

Abbastanza semplice e funziona come un fascino. Grazie Vince e maets.
Edgar Salazar

1
Questa è in realtà la risposta corretta. Una nota, per ottenere SQL in modalità utente singolo ho dovuto eseguire> net stop MSSQL $ SQLEXPRESS e quindi> net start MSSQL $ SQLEXPRESS / m
Ev.

29

Ecco uno script che afferma di essere in grado di risolvere questo problema.

Ottieni i diritti di amministratore per il tuo SQL Server Express locale con questo semplice script

Link per il download allo script

Descrizione

Questo script di comandi consente di aggiungersi facilmente al ruolo sysadmin di un'istanza di SQL Server locale. È necessario essere un membro del gruppo Administrators locale di Windows o avere accesso alle credenziali di un utente che lo è. Lo script supporta SQL Server 2005 e versioni successive.

Lo script è particolarmente utile se sei uno sviluppatore che cerca di utilizzare SQL Server 2008 Express installato da qualcun altro. In questa situazione di solito non si hanno i diritti di amministratore per l'istanza di SQL Server 2008 Express, poiché per impostazione predefinita solo la persona che installa SQL Server 2008 dispone dei privilegi di amministratore.

L'utente che ha installato SQL Server 2008 Express può utilizzare SQL Server Management Studio per concedere i privilegi necessari. Ma cosa succede se SQL Server Management Studio non è stato installato? O peggio se l'utente che installa non è più disponibile?

Questo script risolve il problema in pochi clic!

Nota: è necessario fornire al file BAT un "Nome istanza" (probabilmente "MSSQLSERVER", ma potrebbe non esserlo): è possibile ottenere il valore eseguendo prima quanto segue nella "Console di gestione di Microsoft SQL Server ":

 SELECT @@servicename

Quindi copia il risultato da utilizzare quando il file BAT richiede "Nome istanza SQL".

  @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

2
Ha funzionato per me. Una cosa da tenere a mente, assicurati di avere l'estensione .js mappata su Microsoft ® Windows Based Script Hostaltrimenti questo voodoo non funzionerà (avevo il mio mappato su notepad.exe).
Phil Cooper,

2
I collegamenti sono morti - "La Galleria dell'Archivio è stata ritirata".
stuartd

3
@stuartd - ha aggiunto la sceneggiatura
Chris Gessler

se hai problemi ad aggiungerti come amministratore usando lo script sopra. Prova ad aggiungere il tuo login al database e quindi esegui lo script.
Ram

2
Qualcuno ha aggiunto questo a GitHub. Questo script è un vero risparmio di tempo. gist.github.com/wadewegner/1677788
Patrick

6

Microsoft ha un articolo su questo problema. Esegue tutto passo dopo passo.

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

In breve, si tratta di avviare l'istanza di sqlserver con -mcome suggeriscono tutte le altre risposte. Tuttavia Microsoft fornisce istruzioni leggermente più dettagliate.

Dalla pagina iniziale, avvia SQL Server Management Studio. Nel menu Visualizza, seleziona Server registrati. (Se il server non è già registrato, fare clic con il pulsante destro del mouse su Gruppi di server locali, scegliere Attività, quindi fare clic su Registra server locali.)

Nell'area Server registrati, fare clic con il pulsante destro del mouse sul server, quindi fare clic su Gestione configurazione SQL Server. Questo dovrebbe richiedere l'autorizzazione per essere eseguito come amministratore, quindi aprire il programma Configuration Manager.

Chiudi Management Studio.

In Gestione configurazione SQL Server, nel riquadro di sinistra, selezionare Servizi SQL Server. Nel riquadro di destra, trova la tua istanza di SQL Server. (L'istanza predefinita di SQL Server include (MSSQLSERVER) dopo il nome del computer. Le istanze denominate vengono visualizzate in maiuscolo con lo stesso nome che hanno nei server registrati.) Fare clic con il pulsante destro del mouse sull'istanza di SQL Server, quindi fare clic su Proprietà.

Nella scheda Parametri di avvio, nella casella Specifica un parametro di avvio, digitare -m e quindi fare clic su Aggiungi. (È un trattino seguito dalla lettera minuscola m.)

Nota

Per alcune versioni precedenti di SQL Server non è disponibile la scheda Parametri di avvio. In tal caso, nella scheda Avanzate, fare doppio clic su Parametri di avvio. I parametri si aprono in una finestra molto piccola. Fare attenzione a non modificare nessuno dei parametri esistenti. Alla fine, aggiungi un nuovo parametro; -m e quindi fai clic su OK. (È un punto e virgola, quindi un trattino e una lettera minuscola m.)

Fare clic su OK e dopo il messaggio per riavviare, fare clic con il pulsante destro del mouse sul nome del server e quindi fare clic su Riavvia.

Dopo il riavvio di SQL Server, il server sarà in modalità utente singolo. Assicurati che SQL Server Agent non sia in esecuzione. Se avviato, richiederà la tua unica connessione.

Nella schermata iniziale di Windows 8, fare clic con il pulsante destro del mouse sull'icona di Management Studio. Nella parte inferiore dello schermo, seleziona Esegui come amministratore. (Questo passerà le tue credenziali di amministratore a SSMS.)

Nota

Per le versioni precedenti di Windows, l'opzione Esegui come amministratore appare come un sottomenu.

In alcune configurazioni, SSMS tenterà di effettuare diverse connessioni. Più connessioni avranno esito negativo perché SQL Server è in modalità utente singolo. È possibile selezionare una delle seguenti azioni da eseguire. Effettuare una delle seguenti operazioni.

a) Connettiti a Esplora oggetti utilizzando l'autenticazione di Windows (che include le tue credenziali di amministratore). Espandi Sicurezza, espandi Login e fai doppio clic sul tuo login. Nella pagina Ruoli del server selezionare sysadmin e quindi fare clic su OK.

b) Invece di connettersi con Object Explorer, connettersi a una finestra di query utilizzando l'autenticazione di Windows (che include le credenziali di amministratore). È possibile connettersi in questo modo solo se non ci si è connessi a Esplora oggetti. Eseguire codice come il seguente per aggiungere un nuovo account di accesso con autenticazione di Windows che sia un membro del ruolo predefinito del server sysadmin. L'esempio seguente aggiunge un utente di dominio denominato CONTOSO \ PatK.

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

c) Se SQL Server è in esecuzione in modalità di autenticazione mista, connettersi a una finestra di query utilizzando l'autenticazione di Windows (che include le credenziali di amministratore). Eseguire codice come il seguente per creare un nuovo account di accesso di autenticazione di SQL Server che sia un membro del ruolo predefinito del server sysadmin.

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

Avvertimento:

Sostituisci ************ con una password complessa.

d) Se SQL Server è in esecuzione in modalità di autenticazione mista e si desidera reimpostare la password dell'account sa, connettersi a una finestra di query utilizzando l'autenticazione di Windows (che include le credenziali di amministratore). Modificare la password dell'account sa con la seguente sintassi.

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

Sostituisci ************ con una password complessa.

I passaggi seguenti ora riportano SQL Server alla modalità multiutente. Chiudi SSMS.

In Gestione configurazione SQL Server, nel riquadro di sinistra, selezionare Servizi SQL Server. Nel riquadro di destra fare clic con il pulsante destro del mouse sull'istanza di SQL Server e quindi fare clic su Proprietà.

Nella scheda Parametri di avvio, nella casella Parametri esistenti, selezionare -m e quindi fare clic su Rimuovi.

Nota

Per alcune versioni precedenti di SQL Server non è disponibile la scheda Parametri di avvio. In tal caso, nella scheda Avanzate, fare doppio clic su Parametri di avvio. I parametri si aprono in una finestra molto piccola. Rimuovere il; -m aggiunto in precedenza, quindi fare clic su OK.

Fare clic con il pulsante destro del mouse sul nome del server e quindi fare clic su Riavvia.

Ora dovresti essere in grado di connetterti normalmente con uno degli account che ora è un membro del ruolo predefinito del server sysadmin.


2

In realtà è sufficiente aggiungere -m ai parametri di avvio su Sql Server Configuration Manager, riavviare il servizio, andare su ssms e aggiungere la casella di controllo sysadmin sul tuo account, quindi rimuovere -m riavvia di nuovo e usa come al solito.

Opzioni di avvio del servizio del motore di database

-m Avvia un'istanza di SQL Server in modalità utente singolo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.