Дефіс в імені мого комп'ютера викликає помилку T-SQL


13

Я розробник, а не DBA (що показує, боюся). Я намагаюся запустити програму Report Builder 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. Чи можу я як-небудь дати нове ім’я користувача / логіна для Builder 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;

Урок засвоєний, не використовуйте спеціальних символів. Інакше будьте готові боротися з ними з деяким болем :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.