Guión en el nombre de mi computadora que causa un error T-SQL

13

Soy un desarrollador, no un DBA (que se muestra, me temo). Estoy tratando de ejecutar Report Builder 3.0 con SQL Server 2014 Express en la computadora de mi casa (con nombre John-PC) y no puedo ejecutar mis informes.

Accidentalmente creé una combinación de usuario / inicio de sesión de user = John-PCy login = John-PC\John. Cuando intento eliminar la entrada con:

Drop Login John-PC\John

Me sale un error:

Sintaxis incorrecta cerca '-'.

Creo que el problema es el guión en el nombre de mi computadora.

  1. ¿Hay alguna forma de evitar el error de sintaxis?
  2. ¿Hay otra forma de cambiar o descartar al usuario (intenté abandonarlo sys.server_principalspero recibí un error que no pude hacer cambios ad hoc)
  3. ¿Puedo darle a Report Builder un nuevo nombre de usuario / inicio de sesión de alguna manera?
  4. Si ninguno de los anteriores, ¿puedo cambiar el nombre de mi computadora John_PCo creará otros problemas que ni siquiera puedo imaginar?
John MM
fuente

Respuestas:

21

Cuando tenga caracteres especiales en un nombre, ponga [] alrededor para que SQL sepa que es un identificador. Así es también como manejas personajes especiales.

Entonces en tu caso

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

Si solo tiene un inicio de sesión, funcionará con una cita manual[ ] . Si usted tiene muchos de ellos, entonces usted tiene que construir un SQL dinámico como el de abajo para conseguir la progrmatically drop login [login_to_drop]de sys.server_principalsusar 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;

Lección aprendida, no use caracteres especiales ... de lo contrario, prepárese para lidiar con ellos con un poco de dolor :-)

Kin Shah
fuente