Trattino nel nome del mio computer che causa errore T-SQL


13

Sono uno sviluppatore, non un DBA (che sta mostrando, temo). Sto cercando di eseguire Report Builder 3.0 con SQL Server 2014 Express sul mio computer di casa (denominato John-PC) e non riesco a eseguire i miei rapporti.

Ho creato accidentalmente una combinazione utente / accesso di user = John-PCe login = John-PC\John. Quando provo ad eliminare la voce con:

Drop Login John-PC\John

Ottengo un errore:

Sintassi errata vicino a "-".

Penso che il problema sia il trattino nel nome del mio computer.

  1. C'è un modo per aggirare l'errore di sintassi?
  2. Esiste un altro modo per modificare o eliminare l'utente (ho provato a lasciar perdere sys.server_principalsma ho ricevuto un errore che non è stato possibile apportare modifiche ad hoc).
  3. Posso dare a Generatore report un nuovo nome utente / login in qualche modo?
  4. Se nessuno dei precedenti, posso cambiare il nome del mio computer John_PCo creare una serie di altri problemi che non riesco nemmeno a immaginare?

Risposte:


21

Quando hai un carattere speciale in un nome, metti [] attorno ad esso per far sapere a SQL che si tratta di un identificatore. Questo è anche il modo in cui gestisci personaggi speciali.

Quindi nel tuo caso

Drop Login [John-PC\John]

12

Se hai un solo login, allora quotarlo manualmente con [ ]funzionerà. Se si dispone di molti di loro, allora si deve costruire uno SQL dinamico come qui sotto per ottenere il progrmatically drop login [login_to_drop]da sys.server_principalsutilizzare 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;

Lezione imparata, non usare caratteri speciali .. altrimenti preparati a affrontarli con un po 'di dolore :-)

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.