Como concedo a mim mesmo acesso de administrador a uma instância local do SQL Server?

92

Instalei o SQL Server 2008 R2 em minha máquina local. Mas, não consigo criar um novo banco de dados por causa de direitos (ou falta de).

"CRIAR PERMISSÃO DE BANCO DE DADOS NEGADA"

Então, tentei atribuir os privilégios de administrador ao meu login atual

"O usuário não tem permissão para realizar esta ação."

Também tentei criar um novo login que teria privilégios de administrador, mas sem sorte. Como concedo a mim mesmo direitos de administrador para criar um banco de dados? Posso reinstalar, mas prefiro não fazê-lo.

SkonJeet
fonte
1
Você está tentando se conectar via autenticação do SQL Server ou autenticação do Windows?
Darren
Autenticação do Windows (veja o título). Estou me conectando com sucesso. Os erros vêm da tentativa de executar tarefas administrativas.
SkonJeet

Respostas:

70

Sim - parece que você se esqueceu de se adicionar à função sysadmin ao instalar o SQL Server. Se você for um administrador local em sua máquina, esta postagem de blog pode ajudá-lo a usar o SQLCMD para colocar sua conta no grupo sysadmin do SQL Server sem precisar reinstalar. É uma brecha de segurança no SQL Server, se você quer saber, mas vai te ajudar neste caso.

Brian Knight
fonte
15
Não é uma falha de segurança, os administradores locais precisam ter direitos ao sql server, na verdade um administrador local seria capaz de acessar os dados do sql server copiando os arquivos de dados para outra máquina (e copiando de volta se necessário), então sua única maneira de contornar isso é limitar as permissões administrativas apenas para aqueles que merecem.
yoel halb
ISSO deveria ser mais fácil do que desinstalar / reinstalar? Dificilmente! No meu caso, fomos migrados para outro domínio; todos os logins existentes são inúteis.
dudeNumber4
8
O link está morto (e respostas apenas com link são desencorajadas). stackoverflow.com/a/9889484/389424 tem as mesmas instruções da postagem original do blog
janv8000
81

Abra uma janela de prompt de comando. Se você já tiver uma instância padrão do SQL Server em execução, execute o seguinte comando no prompt de comando para interromper o serviço do SQL Server:

net stop mssqlserver

Agora vá para o diretório onde o SQL server está instalado. O diretório pode, por exemplo, ser um destes:

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

Descubra seu diretório MSSQL e CDnele como tal:

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

Agora execute o seguinte comando para iniciar o SQL Server no modo de usuário único. Como SQLCMDestá sendo especificado, apenas uma SQLCMDconexão pode ser feita (de outra janela do prompt de comando).

sqlservr -m"SQLCMD"

Agora, abra outra janela de prompt de comando com o mesmo usuário que iniciou o SQL Server no modo de usuário único acima e, nela, execute:

sqlcmd

E pressione Enter. Agora você pode executar instruções SQL na instância do SQL Server em execução no modo de usuário ú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

Fonte .

ATUALIZADO Não se esqueça do ponto- ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];e- vírgula depois e não adicione ponto-e-vírgula extra depois GOou o comando nunca será executado.

Darren
fonte
Observe rapidamente que sp_addsrvrolemember foi substituído por ALTER SERVER ROLE. por exemploALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin
Não se esqueça de adicionar o GO;no final
NMrt
Visto que muitos de nós agora executamos o SQL Server sem SSMS, acho que esta é uma resposta muito melhor.
Chaim Eliyah de
38

Adotei um banco de dados SQL 2012 em que não era um administrador de sistema, mas sim um administrador da máquina. Usei o SSMS com "Executar como administrador", adicionei minha conta do NT como um login SQL e configurei a função do servidor para sysadmin. Sem problemas.

Vince P.
fonte
14
Esta solução funcionou para mim, com uma etapa adicional necessária: Tive que iniciar o sql server no modo de usuário único adicionando o sinalizador "-m". Isso pode ser feito usando o "SQL Server Configuration Manager", clique com o botão direito do mouse na instância do servidor e selecione as propriedades, vá até a aba "Startup Parameters" e adicione -m.
maets
Isso é incrível. Muito mais simples do que as outras respostas.
McKay
Definitivamente mais rápido e melhor de todas as respostas
Johnny
Muito simples e funciona como um encanto. Obrigado Vince e maets.
Edgar Salazar,
1
Esta é realmente a resposta correta. Uma nota, para obter o SQL no modo de usuário único, tive que executar> net stop MSSQL $ SQLEXPRESS e, em seguida,> net start MSSQL $ SQLEXPRESS / m
Ev.
29

Aqui está um script que afirma ser capaz de corrigir isso.

Obtenha direitos de administrador para seu SQL Server Express local com este script simples

Baixe o link para o script

Descrição

Este script de comando permite que você se adicione facilmente à função sysadmin de uma instância local do SQL Server. Você deve ser membro do grupo de Administradores locais do Windows ou ter acesso às credenciais de um usuário que o seja. O script oferece suporte ao SQL Server 2005 e posterior.

O script é mais útil se você for um desenvolvedor que está tentando usar o SQL Server 2008 Express que foi instalado por outra pessoa. Nessa situação, você geralmente não terá direitos de administrador para a instância do SQL Server 2008 Express, já que, por padrão, apenas a pessoa que instala o SQL Server 2008 tem privilégios administrativos.

O usuário que instalou o SQL Server 2008 Express pode usar o SQL Server Management Studio para conceder os privilégios necessários a você. Mas e se o SQL Server Management Studio não tiver sido instalado? Ou pior, se o usuário de instalação não estiver mais disponível?

Este script corrige o problema em apenas alguns cliques!

Observação: você precisará fornecer ao arquivo BAT um 'Nome da instância' (provavelmente será 'MSSQLSERVER' - mas pode não ser): você pode obter o valor executando primeiro o seguinte no "Console de gerenciamento do Microsoft SQL Server ":

 SELECT @@servicename

Em seguida, copie o resultado para usar quando o arquivo BAT solicitar 'nome da instância 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
fonte
2
Funcionou para mim. Uma coisa a ter em mente, certifique-se de ter a extensão .js mapeada para o, Microsoft ® Windows Based Script Hostcaso contrário, este vodu não funcionará (eu mapeei o meu para notepad.exe).
Phil Cooper
2
Links estão mortos - "The Archive Gallery foi retirado".
stuartd
3
@stuartd - adicionado o script
Chris Gessler
se você estiver enfrentando problemas para se adicionar como administrador usando o script acima. Tente adicionar seu login ao banco de dados e, em seguida, execute o script.
Ram
2
Alguém adicionou isso ao GitHub. Este script economiza tempo real. gist.github.com/wadewegner/1677788
Patrick
6

A Microsoft tem um artigo sobre esse problema. Ele passa por tudo passo a passo.

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

Resumindo, envolve iniciar a instância de sqlserver -mcomo todas as outras respostas sugerem. No entanto, a Microsoft fornece instruções um pouco mais detalhadas.

Na página inicial, inicie o SQL Server Management Studio. No menu Exibir, selecione Servidores registrados. (Se o seu servidor ainda não estiver registrado, clique com o botão direito em Grupos de servidores locais, aponte para Tarefas e clique em Registrar servidores locais.)

Na área Servidores registrados, clique com o botão direito do mouse no servidor e clique em SQL Server Configuration Manager. Isso deve pedir permissão para executar como administrador e, em seguida, abrir o programa Configuration Manager.

Feche o Management Studio.

No SQL Server Configuration Manager, no painel esquerdo, selecione SQL Server Services. No painel direito, encontre sua instância do SQL Server. (A instância padrão do SQL Server inclui (MSSQLSERVER) após o nome do computador. As instâncias nomeadas aparecem em letras maiúsculas com o mesmo nome de Servidores registrados.) Clique com o botão direito do mouse na instância do SQL Server e clique em Propriedades.

Na guia Parâmetros de Inicialização, na caixa Especificar um parâmetro de inicialização, digite -m e clique em Adicionar. (Isso é um travessão e depois a letra m minúscula.)

Nota

Para algumas versões anteriores do SQL Server, não há guia Parâmetros de inicialização. Nesse caso, na guia Avançado, clique duas vezes em Parâmetros de inicialização. Os parâmetros são abertos em uma janela muito pequena. Tenha cuidado para não alterar nenhum dos parâmetros existentes. No final, adicione um novo parâmetro; -m e clique em OK. (Isso é um ponto-e-vírgula, um travessão e a letra m minúscula.)

Clique em OK e, após a mensagem para reiniciar, clique com o botão direito do mouse no nome do servidor e clique em Reiniciar.

Depois que o SQL Server for reiniciado, seu servidor estará no modo de usuário único. Certifique-se de que o SQL Server Agent não esteja em execução. Se iniciado, levará sua única conexão.

Na tela inicial do Windows 8, clique com o botão direito do mouse no ícone do Management Studio. Na parte inferior da tela, selecione Executar como administrador. (Isso passará suas credenciais de administrador ao SSMS.)

Nota

Para versões anteriores do Windows, a opção Executar como administrador aparece como um submenu.

Em algumas configurações, o SSMS tentará fazer várias conexões. Várias conexões falharão porque o SQL Server está no modo de usuário único. Você pode selecionar uma das seguintes ações para executar. Faça um dos seguintes.

a) Conecte-se com o Object Explorer usando a autenticação do Windows (que inclui suas credenciais de administrador). Expanda Segurança, expanda Logins e clique duas vezes em seu próprio login. Na página Funções do servidor, selecione sysadmin e clique em OK.

b) Em vez de se conectar com o Object Explorer, conecte-se com uma janela de consulta usando a autenticação do Windows (que inclui suas credenciais de administrador). (Você só pode se conectar dessa forma se não tiver se conectado ao Pesquisador de Objetos.) Execute o código como o seguinte para adicionar um novo logon de Autenticação do Windows que seja membro da função de servidor fixa sysadmin. O exemplo a seguir adiciona um usuário de domínio denominado CONTOSO \ PatK.

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

c) Se o SQL Server estiver executando no modo de autenticação mista, conecte-se a uma janela de consulta usando a autenticação do Windows (que inclui suas credenciais de administrador). Execute o código como o seguinte para criar um novo logon de autenticação do SQL Server que seja membro da função de servidor fixa sysadmin.

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

Aviso:

Substitua ************ por uma senha forte.

d) Se o SQL Server estiver executando no modo de autenticação misto e você quiser redefinir a senha da conta sa, conecte-se a uma janela de consulta usando a autenticação do Windows (que inclui suas credenciais de administrador). Altere a senha da conta sa com a seguinte sintaxe.

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

Substitua ************ por uma senha forte.

As etapas a seguir agora alteram o SQL Server de volta para o modo multiusuário. Feche o SSMS.

No SQL Server Configuration Manager, no painel esquerdo, selecione SQL Server Services. No painel direito, clique com o botão direito do mouse na instância do SQL Server e clique em Propriedades.

Na guia Parâmetros de Inicialização, na caixa Parâmetros existentes, selecione -m e clique em Remover.

Nota

Para algumas versões anteriores do SQL Server, não há guia Parâmetros de inicialização. Nesse caso, na guia Avançado, clique duas vezes em Parâmetros de inicialização. Os parâmetros são abertos em uma janela muito pequena. Remova o; -m adicionado anteriormente e clique em OK.

Clique com o botão direito do mouse no nome do servidor e clique em Reiniciar.

Agora você deve ser capaz de se conectar normalmente com uma das contas que agora é membro da função de servidor fixa sysadmin.

Yair Halberstadt
fonte
2

Na verdade, é suficiente adicionar -m aos parâmetros de inicialização no Sql Server Configuration Manager, reiniciar o serviço, ir para ssms e adicionar a caixa de seleção sysadmin em sua conta e remover -m restart novamente e usar normalmente.

Opções de inicialização do serviço Database Engine

-m Inicia uma instância do SQL Server no modo de usuário único.

norbertas.gaulia
fonte