¿Cómo me concedo acceso de administrador a una instancia de SQL Server local?

93

Instalé SQL Server 2008 R2 en mi máquina local. Pero, no puedo crear una nueva base de datos debido a derechos (o falta de).

"PERMISO PARA CREAR BASE DE DATOS DENEGADO"

Entonces, intenté asignar los privilegios de administrador a mi inicio de sesión actual

"El usuario no tiene permiso para realizar esta acción".

También intenté crear un nuevo inicio de sesión que tuviera privilegios de administrador, pero sin suerte. ¿Cómo me concedo derechos de administrador para poder crear una base de datos? Puedo volver a instalar, pero prefiero no hacerlo.

SkonJeet
fuente
1
¿Está intentando conectarse a través de la autenticación de SQL Server o la autenticación de Windows?
Darren
Autenticación de Windows (ver título). Me estoy conectando con éxito. Los errores provienen de intentar realizar tareas administrativas.
SkonJeet

Respuestas:

70

Sí, parece que olvidó agregarse al rol de administrador de sistemas al instalar SQL Server. Si es un administrador local en su máquina, esta publicación de blog puede ayudarlo a usar SQLCMD para ingresar su cuenta en el grupo de administradores de sistemas de SQL Server sin tener que reinstalar. Es un pequeño agujero de seguridad en SQL Server, si me preguntas, pero te ayudará en este caso.

Brian Knight
fuente
15
No es un agujero de seguridad, los administradores locales deben tener derechos sobre el servidor SQL, de hecho, un administrador local podría acceder de todos modos a los datos del servidor SQL copiando los archivos de datos en otra máquina (y luego copiando si es necesario), entonces su única forma de evitar esto es limitar los permisos administrativos solo a aquellos que lo merecen ..
yoel halb
¿ESO se supone que es más fácil que desinstalar / reinstalar? ¡Apenas! En mi caso, fuimos migrados a otro dominio; todos los inicios de sesión existentes son inútiles.
dudeNumber4
8
El enlace está muerto (y se desaconsejan las respuestas de solo enlace). stackoverflow.com/a/9889484/389424 tiene las mismas instrucciones que la publicación del blog original
janv8000
82

Abra una ventana de símbolo del sistema. Si ya tiene una instancia predeterminada de SQL Server en ejecución, ejecute el siguiente comando en el símbolo del sistema para detener el servicio de SQL Server:

net stop mssqlserver

Ahora vaya al directorio donde está instalado el servidor SQL. El directorio puede ser, por ejemplo, uno de estos:

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

Descubra su directorio MSSQL e introdúzcalo CDcomo tal:

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

Ahora ejecute el siguiente comando para iniciar SQL Server en modo de usuario único. Como SQLCMDse especifica, solo se SQLCMDpuede realizar una conexión (desde otra ventana del símbolo del sistema).

sqlservr -m"SQLCMD"

Ahora, abra otra ventana del símbolo del sistema como el mismo usuario que inició SQL Server en el modo de usuario único anterior y, en ella, ejecute:

sqlcmd

Y presione enter. Ahora puede ejecutar declaraciones SQL en la instancia de SQL Server que se ejecuta en modo de usuario único:

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

Fuente .

ACTUALIZADO No olvide un punto ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];y coma después y no agregue un punto y coma adicional después GOo el comando nunca se ejecutará.

Darren
fuente
Nota rápida que sp_addsrvrolemember ha sido reemplazado por ALTER SERVER ROLE. por ejemploALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermín
No olvide agregar GO;al final
NMrt
Dado que muchos de nosotros estamos ejecutando SQL Server sin SSMS, creo que esta es una respuesta mucho mejor.
Chaim Eliyah
39

Adopté una base de datos SQL 2012 en la que no era un administrador de sistemas, pero era un administrador en la máquina. Usé SSMS con "Ejecutar como administrador", agregué mi cuenta NT como inicio de sesión SQL y configuré la función del servidor en sysadmin. No hay problema.

Vince P.
fuente
14
Esta solución funcionó para mí, con un paso adicional requerido: Tuve que iniciar el servidor SQL en modo de usuario único agregando el indicador "-m". Esto se puede hacer usando el "Administrador de configuración de SQL Server", haga clic derecho en la instancia del servidor y seleccione propiedades, vaya a la pestaña "Parámetros de inicio" y agregue -m.
maets
Esto es asombroso. Mucho más simple que las otras respuestas.
McKay
1
Definitivamente más rápido y mejor de todas las respuestas
Johnny
Bastante sencillo y funciona como un encanto. Gracias Vince y maets.
Edgar Salazar
1
Esta es realmente la respuesta correcta. Una nota, para obtener SQL en modo de usuario único tuve que ejecutar> net stop MSSQL $ SQLEXPRESS y luego> net start MSSQL $ SQLEXPRESS / m
Ev.
29

Aquí hay un script que dice poder solucionar este problema.

Obtenga derechos de administrador para su SQL Server Express local con este sencillo script

Descargar enlace al script

Descripción

Este script de comando le permite agregarse fácilmente a la función de administrador de sistemas de una instancia local de SQL Server. Debe ser miembro del grupo de administradores locales de Windows o tener acceso a las credenciales de un usuario que lo sea. El script es compatible con SQL Server 2005 y versiones posteriores.

La secuencia de comandos es más útil si es un desarrollador que intenta utilizar SQL Server 2008 Express que fue instalado por otra persona. En esta situación, por lo general, no tendrá derechos de administrador para la instancia de SQL Server 2008 Express, ya que, de forma predeterminada, solo la persona que instala SQL Server 2008 tiene privilegios administrativos.

El usuario que instaló SQL Server 2008 Express puede usar SQL Server Management Studio para otorgarle los privilegios necesarios. Pero, ¿y si no se instaló SQL Server Management Studio? ¿O peor si el usuario instalador ya no está disponible?

¡Este script soluciona el problema con unos pocos clics!

Nota: Deberá proporcionar el archivo BAT con un 'Nombre de instancia' (probablemente será 'MSSQLSERVER', pero es posible que no lo sea): puede obtener el valor ejecutando primero lo siguiente en la "Consola de administración de Microsoft SQL Server ":

 SELECT @@servicename

Luego copie el resultado para usarlo cuando el archivo BAT solicite 'nombre de instancia 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
Chris Gessler
fuente
2
Trabajó para mi. Una cosa a tener en cuenta, asegúrese de tener la extensión .js asignada al, de lo Microsoft ® Windows Based Script Hostcontrario, este vudú no funcionará (tenía el mío asignado a notepad.exe).
Phil Cooper
2
Los enlaces están muertos: "La Galería de archivos se ha retirado".
stuartd
3
@stuartd - agregó el guión
Chris Gessler
si tiene problemas para agregarse como administrador usando el script anterior. Intente agregar su nombre de usuario a la base de datos y luego ejecute el script.
Ram
2
Alguien agregó esto a GitHub. Este script es un verdadero ahorro de tiempo. gist.github.com/wadewegner/1677788
Patrick
6

Microsoft tiene un artículo sobre este tema. Lo repasa todo paso a paso.

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

En resumen, implica iniciar la instancia de sqlserver con -mcomo sugieren todas las otras respuestas. Sin embargo, Microsoft proporciona instrucciones un poco más detalladas.

Desde la página de Inicio, inicie SQL Server Management Studio. En el menú Ver, seleccione Servidores registrados. (Si su servidor aún no está registrado, haga clic con el botón derecho en Grupos de servidores locales, seleccione Tareas y luego haga clic en Registrar servidores locales).

En el área de Servidores registrados, haga clic con el botón derecho en su servidor y luego haga clic en Administrador de configuración de SQL Server. Esto debería solicitar permiso para ejecutarse como administrador y luego abrir el programa Configuration Manager.

Cierre Management Studio.

En el Administrador de configuración de SQL Server, en el panel izquierdo, seleccione Servicios de SQL Server. En el panel derecho, busque su instancia de SQL Server. (La instancia predeterminada de SQL Server incluye (MSSQLSERVER) después del nombre del equipo. Las instancias con nombre aparecen en mayúsculas con el mismo nombre que tienen en los servidores registrados.) Haga clic con el botón derecho en la instancia de SQL Server y luego haga clic en Propiedades.

En la pestaña Parámetros de inicio, en el cuadro Especificar un parámetro de inicio, escriba -my luego haga clic en Agregar. (Eso es un guión y luego la letra m minúscula).

Nota

Para algunas versiones anteriores de SQL Server, no existe la pestaña Parámetros de inicio. En ese caso, en la pestaña Avanzado, haga doble clic en Parámetros de inicio. Los parámetros se abren en una ventana muy pequeña. Tenga cuidado de no cambiar ninguno de los parámetros existentes. Al final, agregue un nuevo parámetro; -m y luego haga clic en Aceptar. (Eso es un punto y coma, luego un guión y luego la letra m minúscula).

Haga clic en Aceptar y, después del mensaje para reiniciar, haga clic con el botón derecho en el nombre de su servidor y luego en Reiniciar.

Una vez que SQL Server se haya reiniciado, su servidor estará en modo de usuario único. Asegúrese de que el Agente SQL Server no se esté ejecutando. Si se inicia, tomará su única conexión.

En la pantalla de inicio de Windows 8, haga clic con el botón derecho en el icono de Management Studio. En la parte inferior de la pantalla, seleccione Ejecutar como administrador. (Esto pasará sus credenciales de administrador a SSMS).

Nota

Para versiones anteriores de Windows, la opción Ejecutar como administrador aparece como un submenú.

En algunas configuraciones, SSMS intentará realizar varias conexiones. Varias conexiones fallarán porque SQL Server está en modo de usuario único. Puede seleccionar una de las siguientes acciones para realizar. Haz una de las siguientes.

a) Conéctese con el Explorador de objetos mediante la autenticación de Windows (que incluye sus credenciales de administrador). Expanda Seguridad, expanda Inicios de sesión y haga doble clic en su propio inicio de sesión. En la página Funciones del servidor, seleccione sysadmin y luego haga clic en Aceptar.

b) En lugar de conectarse con el Explorador de objetos, conéctese con una ventana de consulta mediante la autenticación de Windows (que incluye sus credenciales de administrador). (Solo puede conectarse de esta manera si no se conectó con el Explorador de objetos). Ejecute un código como el siguiente para agregar un nuevo inicio de sesión de autenticación de Windows que sea miembro de la función fija de servidor sysadmin. El siguiente ejemplo agrega un usuario de dominio llamado CONTOSO \ PatK.

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

c) Si su servidor SQL se está ejecutando en modo de autenticación mixto, conéctese con una ventana de consulta mediante la autenticación de Windows (que incluye sus credenciales de administrador). Ejecute un código como el siguiente para crear un nuevo inicio de sesión de autenticación de SQL Server que sea miembro de la función fija de servidor sysadmin.

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

Advertencia:

Reemplace ************ con una contraseña segura.

d) Si su servidor SQL se está ejecutando en modo de autenticación mixta y desea restablecer la contraseña de la cuenta sa, conéctese con una ventana de consulta mediante la autenticación de Windows (que incluye sus credenciales de administrador). Cambie la contraseña de la cuenta sa con la siguiente sintaxis.

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

Reemplace ************ con una contraseña segura.

Los siguientes pasos ahora cambian SQL Server de nuevo al modo multiusuario. Cierre SSMS.

En el Administrador de configuración de SQL Server, en el panel izquierdo, seleccione Servicios de SQL Server. En el panel derecho, haga clic con el botón derecho en la instancia de SQL Server y luego haga clic en Propiedades.

En la pestaña Parámetros de inicio, en el cuadro Parámetros existentes, seleccione -m y luego haga clic en Eliminar.

Nota

Para algunas versiones anteriores de SQL Server, no existe la pestaña Parámetros de inicio. En ese caso, en la pestaña Avanzado, haga doble clic en Parámetros de inicio. Los parámetros se abren en una ventana muy pequeña. Elimine el; -m que agregó anteriormente y luego haga clic en Aceptar.

Haga clic con el botón derecho en el nombre de su servidor y luego haga clic en Reiniciar.

Ahora debería poder conectarse normalmente con una de las cuentas que ahora es miembro del rol fijo de servidor sysadmin.

Yair Halberstadt
fuente
2

En realidad, es suficiente agregar -m a los parámetros de inicio en Sql Server Configuration Manager, reiniciar el servicio, ir a ssms y agregar la casilla de verificación sysadmin en su cuenta, luego eliminar -m reiniciar nuevamente y usar como de costumbre.

Opciones de inicio del servicio del motor de base de datos

-m Inicia una instancia de SQL Server en modo de usuario único.

norbertas.gaulia
fuente