Tiret au nom de mon ordinateur provoquant une erreur T-SQL

13

Je suis développeur, pas DBA (ce qui montre, je le crains). J'essaie d'exécuter Report Builder 3.0 avec SQL Server 2014 Express sur mon ordinateur personnel (nomméJohn-PC ) et je ne peux pas exécuter mes rapports.

J'ai accidentellement créé un combo utilisateur / connexion de user = John-PCet login = John-PC\John. Lorsque j'essaie de supprimer l'entrée avec:

Drop Login John-PC\John

Je reçois une erreur:

Syntaxe incorrecte près de '-'.

Je pense que le problème est le trait d'union au nom de mon ordinateur.

  1. Existe-t-il un moyen de contourner l'erreur de syntaxe?
  2. Existe-t-il un autre moyen de modifier ou de supprimer l'utilisateur (j'ai essayé de supprimer sys.server_principalsmais j'ai reçu une erreur que je n'ai pas pu apporter de modifications ad hoc).
  3. Puis-je attribuer un nouveau nom d'utilisateur / nom de connexion au Générateur de rapports?
  4. Si rien de ce qui précède, puis-je changer le nom de mon ordinateur John_PCou cela créera-t-il une foule d'autres problèmes que je ne peux même pas imaginer?
John MM
la source

Réponses:

21

Lorsque vous avez des caractères spéciaux dans un nom, mettez [] autour pour indiquer à SQL qu'il s'agit d'un identifiant. C'est également ainsi que vous gérez les caractères spéciaux.

Donc dans ton cas

Drop Login [John-PC\John]
Kenneth Fisher
la source
12

Si vous n'avez qu'une seule connexion, la citer manuellement avec [ ]fonctionnera. Si vous avez beaucoup d'entre eux , alors vous devez construire une sql dynamique comme ci - dessous pour obtenir l'progrmatically drop login [login_to_drop]de l' sys.server_principalsaide 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;

Leçon apprise, n'utilisez pas de caractères spéciaux ... sinon préparez-vous à y faire face avec une certaine douleur :-)

Kin Shah
la source