Dấu gạch nối trong tên máy tính của tôi gây ra lỗi T-SQL


13

Tôi là một nhà phát triển, không phải là một DBA (đang hiển thị, tôi sợ). Tôi đang cố gắng chạy Báo cáo Builder 3.0 với SQL Server 2014 Express trên máy tính ở nhà của tôi (có tên John-PC) và không thể chạy các báo cáo của tôi.

Tôi vô tình tạo ra một kết hợp người dùng / đăng nhập user = John-PClogin = John-PC\John. Khi tôi cố gắng xóa mục với:

Drop Login John-PC\John

Tôi gặp lỗi:

Cú pháp không chính xác gần '-'.

Tôi nghĩ vấn đề là dấu gạch nối trong tên máy tính của tôi.

  1. Có cách nào để khắc phục lỗi cú pháp không?
  2. Có cách nào khác để thay đổi hoặc loại bỏ người dùng không (tôi đã thử từ bỏ sys.server_principalsnhưng nhận được một lỗi mà tôi không thể thực hiện thay đổi đặc biệt).
  3. Tôi có thể cung cấp cho Trình tạo Báo cáo một tên người dùng / tên đăng nhập mới bằng cách nào đó không?
  4. Nếu không có điều nào ở trên, tôi có thể thay đổi tên máy tính của mình thành John_PChoặc sẽ tạo ra một loạt các vấn đề khác mà tôi thậm chí không thể tưởng tượng được?

Câu trả lời:


21

Khi bạn có các ký tự đặc biệt trong một tên, hãy đặt [] xung quanh nó để cho SQL biết rằng đó là một định danh. Đây cũng là cách bạn quản lý các nhân vật đặc biệt.

Vì vậy, trong trường hợp của bạn

Drop Login [John-PC\John]

12

Nếu bạn chỉ có một đăng nhập, sau đó tự trích dẫn nó với [ ]ý chí làm việc. Nếu bạn có nhiều người trong số họ thì bạn phải xây dựng một sql động như dưới đây để có thể nhận được drop login [login_to_drop]từ sys.server_principalsviệc sử dụng 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;

Bài học rút ra, đừng sử dụng các ký tự đặc biệt .. khác hãy chuẩn bị để đối phó với chúng với một số nỗi đau :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.