Hífen no nome do meu computador causando erro T-SQL

13

Eu sou um desenvolvedor, não um DBA (o que está sendo mostrado, eu tenho medo). Estou tentando executar o Report Builder 3.0 com o SQL Server 2014 Express no meu computador doméstico (nomeado John-PC) e não consigo executar meus relatórios.

Eu acidentalmente criei uma combinação de usuário / login de user = John-PCe login = John-PC\John. Quando tento excluir a entrada com:

Drop Login John-PC\John

Eu recebo um erro:

Sintaxe incorreta perto de '-'.

Acho que o problema é o hífen no nome do meu computador.

  1. Existe uma maneira de contornar o erro de sintaxe?
  2. Existe outra maneira de alterar ou descartar o usuário (tentei sair, sys.server_principalsmas recebi um erro que não podia fazer alterações ad hoc).
  3. Posso dar ao Report Builder um novo nome de usuário / login de alguma forma?
  4. Se nenhuma das opções acima, posso alterar o nome do meu computador John_PCou criará uma série de outros problemas que eu nem consigo imaginar?
John MM
fonte

Respostas:

21

Quando você tiver caracteres especiais em um nome, coloque [] ao redor para que o SQL saiba que é um identificador. Também é assim que você gerencia caracteres especiais.

Então no seu caso

Drop Login [John-PC\John]
Kenneth Fisher
fonte
12

Se você tiver apenas um login, citá- lo manualmente[ ] funcionará. Se você tiver muitos deles, então você tem que construir um SQL dinâmico como abaixo para obter progrmatically a drop login [login_to_drop]partir sys.server_principalsusando QUOTENAME()tsql

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql+= N'DROP LOGIN ' + QUOTENAME(name) + ';' 
FROM sys.server_principals 
WHERE name <> N'sa'                 -- do not drop SA
AND name NOT LIKE N'##%'            -- special logins 
AND name NOT LIKE N'NT [AS]%'       -- special logins NT related
AND [type] IN ('S', 'U', 'G','R')   -- S = SQL login | U = Windows login | G = Windows group | R = Server role
AND principal_id > 256
--AND name in ()                    -- Filter to drop specific logins
AND name <> SUSER_SNAME();          -- This will avoid yourself for being dropped !

PRINT @sql;
-- once you verify that below logins will be dropped, 
-- uncomment below line 
-- EXEC master.sys.sp_executesql @sql;

Lição aprendida, não use caracteres especiais. Caso contrário, esteja preparado para lidar com eles com um pouco de dor :-)

Kin Shah
fonte