Ein Bindestrich im Namen meines Computers verursacht einen T-SQL-Fehler

13

Ich bin ein Entwickler, kein DBA (was ich befürchte). Ich versuche, Report Builder 3.0 mit SQL Server 2014 Express auf meinem Heimcomputer (mit dem Namen John-PC) auszuführen, und kann meine Berichte nicht ausführen.

Ich habe versehentlich eine Benutzer / Login-Kombination aus user = John-PCund erstellt login = John-PC\John. Wenn ich versuche, den Eintrag mit zu löschen:

Drop Login John-PC\John

Ich erhalte einen Fehler:

Falsche Syntax in der Nähe '-'.

Ich denke, das Problem ist der Bindestrich im Namen meines Computers.

  1. Gibt es eine Möglichkeit, den Syntaxfehler zu umgehen?
  2. Gibt es eine andere Möglichkeit, den Benutzer zu ändern oder zu löschen? (Ich habe versucht, zu löschen, habe sys.server_principalsjedoch eine Fehlermeldung erhalten, dass ich keine Ad-hoc-Änderungen vornehmen konnte.)
  3. Kann ich dem Berichts-Generator irgendwie einen neuen Benutzer- / Anmeldenamen geben?
  4. Wenn keines der oben genannten John_PCProbleme vorliegt, kann ich den Namen meines Computers in ändern, oder führt dies zu einer Vielzahl anderer Probleme, die ich mir nicht einmal vorstellen kann?
John MM
quelle

Antworten:

21

Wenn ein Name Sonderzeichen enthält, setzen Sie [] um ihn herum, um SQL mitzuteilen, dass es sich um einen Bezeichner handelt. So verwalten Sie auch Sonderzeichen.

Also in deinem Fall

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

Wenn Sie nur einen Login haben, funktioniert das manuelle Zitieren mit [ ]. Wenn Sie viele von ihnen haben , dann müssen Sie eine dynamische SQL - bauen wie unten an progrmatically die bekommen drop login [login_to_drop]von sys.server_principalsmit 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;

Lektion gelernt, verwenden Sie keine Sonderzeichen. Seien Sie sonst bereit, mit einigen Schmerzen umzugehen :-)

Kin Shah
quelle