Дефис в имени моего компьютера вызывает ошибку T-SQL

13

Я разработчик, а не администратор базы данных (который показывает, я боюсь). Я пытаюсь запустить построитель отчетов 3.0 с SQL Server 2014 Express на своем домашнем компьютере (по имени John-PC) и не могу запустить свои отчеты.

Я случайно создал комбинацию пользователя и логина user = John-PCи login = John-PC\John. Когда я пытаюсь удалить запись с:

Drop Login John-PC\John

Я получаю ошибку:

Неверный синтаксис рядом с '-'.

Я думаю, что проблема заключается в дефисе в имени моего компьютера.

  1. Есть ли способ обойти синтаксическую ошибку?
  2. Есть ли другой способ изменить или удалить пользователя (я пытался удалить, sys.server_principalsно получил сообщение об ошибке, что я не мог сделать специальные изменения).
  3. Могу ли я как-то дать Report Builder нового пользователя / имя для входа?
  4. Если ничего из вышеперечисленного, могу ли я изменить имя моего компьютера на John_PCили создаст множество других проблем, которые я даже не могу себе представить?
Джон ММ
источник

Ответы:

21

Когда в имени есть специальные символы, поместите [] вокруг него, чтобы SQL знал, что это идентификатор. Это также, как вы управляете специальными персонажами.

Так что в вашем случае

Drop Login [John-PC\John]
Кеннет Фишер
источник
12

Если у вас есть только один логин, то будет работать ручное цитирование с [ ]. Если у вас их много, вам нужно создать динамический sql, как показано ниже, чтобы программно получить пользу drop login [login_to_drop]от sys.server_principalsиспользования 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;

Извлеченный урок, не используйте специальные символы .. иначе будьте готовы справиться с ними с некоторой болью :-)

Кин Шах
источник