Làm cách nào để cấp cho mình quyền truy cập quản trị vào phiên bản SQL Server cục bộ?


92

Tôi đã cài đặt SQL Server 2008 R2 vào máy cục bộ của mình. Tuy nhiên, tôi không thể tạo cơ sở dữ liệu mới vì có quyền (hoặc thiếu).

"TẠO CƠ SỞ DỮ LIỆU BỊ TỪ CHỐI"

Vì vậy, tôi đã cố gắng gán đặc quyền quản trị cho thông tin đăng nhập hiện tại của mình

"Người dùng không có quyền thực hiện hành động này."

Tôi cũng đã cố gắng tạo thông tin đăng nhập mới có đặc quyền quản trị viên nhưng không may mắn. Làm cách nào để tự cấp quyền quản trị để tôi có thể tạo cơ sở dữ liệu? Tôi có thể cài đặt lại, nhưng tôi không muốn.


1
Bạn đang cố gắng kết nối thông qua xác thực SQL Server hoặc xác thực Windows?
Darren

Xác thực Windows (xem tiêu đề). Tôi đang kết nối thành công. Các lỗi đến từ việc cố gắng thực hiện các tác vụ quản trị.
SkonJeet

Câu trả lời:


70

Có - có vẻ như bạn đã quên thêm mình vào vai trò sysadmin khi cài đặt SQL Server. Nếu bạn là quản trị viên cục bộ trên máy của mình, bài đăng trên blog này có thể giúp bạn sử dụng SQLCMD để đưa tài khoản của mình vào nhóm SQL Server sysadmin mà không cần phải cài đặt lại. Nếu bạn hỏi tôi, đó là một lỗ hổng bảo mật trong SQL Server, nhưng nó sẽ giúp bạn trong trường hợp này.


15
Đó không phải là lỗ hổng bảo mật, quản trị viên cục bộ cần có quyền đối với máy chủ sql, trên thực tế, quản trị viên cục bộ vẫn có thể truy cập dữ liệu của máy chủ sql bằng cách sao chép tệp dữ liệu sang máy khác (và sau đó sao chép lại nếu cần), vì vậy cách duy nhất của bạn xung quanh này là để hạn chế quyền hành chính chỉ đối với những người xứng đáng với nó ..
Yoel halb

ĐÓ được cho là dễ dàng hơn gỡ cài đặt / cài đặt lại? Khó khăn! Trong trường hợp của tôi, chúng tôi đã được di chuyển sang một miền khác; tất cả thông tin đăng nhập hiện có đều vô giá trị.
dudeNumber 4

8
Liên kết đã chết (và các câu trả lời chỉ có liên kết không được khuyến khích). stackoverflow.com/a/9889484/389424 có các hướng dẫn tương tự như bản gốc bài đăng blog
janv8000

80

Mở một cửa sổ nhắc lệnh. Nếu bạn đã chạy phiên bản SQL Server mặc định, hãy chạy lệnh sau trên dấu nhắc lệnh để dừng dịch vụ SQL Server:

net stop mssqlserver

Bây giờ đi đến thư mục nơi máy chủ SQL được cài đặt. Ví dụ, thư mục có thể là một trong những thư mục sau:

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn
C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn

Tìm ra thư mục MSSQL của bạn và CDvào đó như sau:

CD C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn

Bây giờ hãy chạy lệnh sau để khởi động SQL Server ở chế độ một người dùng. Như SQLCMDđang được chỉ định, chỉ SQLCMDcó thể thực hiện một kết nối (từ cửa sổ nhắc lệnh khác).

sqlservr -m"SQLCMD"

Bây giờ, hãy mở một cửa sổ nhắc lệnh khác với cùng một người dùng đã khởi động SQL Server ở chế độ một người dùng ở trên và trong đó, hãy chạy:

sqlcmd

Và nhấn enter. Bây giờ bạn có thể thực thi các câu lệnh SQL đối với phiên bản SQL Server đang chạy ở chế độ người dùng duy nhất:

create login [<<DOMAIN\USERNAME>>] from windows;

-- For older versions of SQL Server:
EXEC sys.sp_addsrvrolemember @loginame = N'<<DOMAIN\USERNAME>>', @rolename = N'sysadmin';

-- For newer versions of SQL Server:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];

GO

Nguồn .

ĐÃ CẬP NHẬT Đừng quên dấu chấm phẩy sau ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];và không thêm dấu chấm phẩy thừa sau GOhoặc lệnh không bao giờ thực thi.


Lưu ý nhanh rằng sp_addsrvrolemember đã được thay thế bởi ALTER SERVER ROLE. ví dụALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin

Đừng quên để thêm GO;ở cuối
NMrt

Cho rằng nhiều người trong chúng ta hiện đang chạy SQL Server mà không có SSMS, tôi cảm thấy đây là một câu trả lời tốt hơn nhiều.
Chaim Eliyah

38

Tôi đã sử dụng cơ sở dữ liệu SQL 2012 trong đó tôi không phải là sysadmin nhưng là quản trị viên trên máy. Tôi đã sử dụng SSMS với "Run as Administrator", thêm tài khoản NT của mình làm thông tin đăng nhập SQL và đặt vai trò máy chủ thành sysadmin. Không vấn đề gì.


14
Giải pháp này phù hợp với tôi, với một bước bổ sung được yêu cầu: Phải khởi động máy chủ sql ở chế độ một người dùng bằng cách thêm cờ "-m". Điều này có thể được thực hiện bằng cách sử dụng "SQL Server Configuration Manager", nhấp chuột phải vào phiên bản máy chủ và chọn thuộc tính, chuyển đến tab "Startup Parameters" và thêm -m.
maets

Điều này thật tuyệt. Vì vậy, đơn giản hơn nhiều so với các câu trả lời khác.
McKay

Chắc chắn nhanh nhất và tốt nhất của tất cả các câu trả lời
Johnny

Khá thẳng thắn và hoạt động như một sự quyến rũ. Cảm ơn Vince và maets.
Edgar Salazar

1
Đây thực sự là câu trả lời chính xác. Một lưu ý, để có được SQL ở chế độ một người dùng, tôi phải chạy> net stop MSSQL $ SQLEXPRESS và sau đó> net start MSSQL $ SQLEXPRESS / m
Ev.

29

Đây là một tập lệnh tuyên bố có thể sửa lỗi này.

Nhận quyền quản trị đối với SQL Server Express cục bộ của bạn bằng tập lệnh đơn giản này

Tải xuống liên kết tới tập lệnh

Sự miêu tả

Tập lệnh lệnh này cho phép bạn dễ dàng tự thêm mình vào vai trò sysadmin của phiên bản SQL Server cục bộ. Bạn phải là thành viên của nhóm Quản trị viên cục bộ Windows hoặc có quyền truy cập vào thông tin đăng nhập của một người dùng. Tập lệnh hỗ trợ SQL Server 2005 trở lên.

Tập lệnh này hữu ích nhất nếu bạn là nhà phát triển đang cố gắng sử dụng SQL Server 2008 Express đã được người khác cài đặt. Trong trường hợp này, bạn thường sẽ không có quyền quản trị đối với phiên bản SQL Server 2008 Express, vì theo mặc định, chỉ người cài đặt SQL Server 2008 mới được cấp đặc quyền quản trị.

Người dùng đã cài đặt SQL Server 2008 Express có thể sử dụng SQL Server Management Studio để cấp các đặc quyền cần thiết cho bạn. Nhưng điều gì sẽ xảy ra nếu SQL Server Management Studio không được cài đặt? Hoặc tệ hơn nếu người dùng cài đặt không có sẵn nữa?

Tập lệnh này khắc phục sự cố chỉ trong vài cú nhấp chuột!

Lưu ý: Bạn sẽ cần cung cấp tệp BAT với 'Tên phiên bản' (Có thể sẽ là 'MSSQLSERVER' - nhưng có thể không): bạn có thể nhận giá trị bằng cách chạy phần sau trong "Bảng điều khiển quản lý máy chủ Microsoft SQL ":

 SELECT @@servicename

Sau đó sao chép kết quả để sử dụng khi tệp BAT nhắc 'tên phiên bản SQL'.

  @echo off 
    rem 
    rem **************************************************************************** 
    rem 
    rem    Copyright (c) Microsoft Corporation. All rights reserved. 
    rem    This code is licensed under the Microsoft Public License. 
    rem    THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 
    rem    ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY 
    rem    IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR 
    rem    PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. 
    rem 
    rem **************************************************************************** 
    rem 
    rem CMD script to add a user to the SQL Server sysadmin role 
    rem 
    rem Input:  %1 specifies the instance name to be modified. Defaults to SQLEXPRESS. 
    rem         %2 specifies the principal identity to be added (in the form "<domain>\<user>"). 
    rem            If omitted, the script will request elevation and add the current user (pre-elevation) to the sysadmin role. 
    rem            If provided explicitly, the script is assumed to be running elevated already. 
    rem 
    rem Method: 1) restart the SQL service with the '-m' option, which allows a single connection from a box admin 
    rem            (the box admin is temporarily added to the sysadmin role with this start option) 
    rem         2) connect to the SQL instance and add the user to the sysadmin role 
    rem         3) restart the SQL service for normal connections 
    rem 
    rem Output: Messages indicating success/failure. 
    rem         Note that if elevation is done by this script, a new command process window is created: the output of this 
    rem         window is not directly accessible to the caller. 
    rem 
    rem 
    setlocal 
    set sqlresult=N/A 
    if .%1 == . (set /P sqlinstance=Enter SQL instance name, or default to SQLEXPRESS: ) else (set sqlinstance=%1) 
    if .%sqlinstance% == . (set sqlinstance=SQLEXPRESS) 
    if /I %sqlinstance% == MSSQLSERVER (set sqlservice=MSSQLSERVER) else (set sqlservice=MSSQL$%sqlinstance%) 
    if .%2 == . (set sqllogin="%USERDOMAIN%\%USERNAME%") else (set sqllogin=%2) 
    rem remove enclosing quotes 
    for %%i in (%sqllogin%) do set sqllogin=%%~i 
    @echo Adding '%sqllogin%' to the 'sysadmin' role on SQL Server instance '%sqlinstance%'. 
    @echo Verify the '%sqlservice%' service exists ... 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto existerror 
    rem 
    rem elevate if <domain/user> was defaulted 
    rem 
    if NOT .%2 == . goto continue 
    echo new ActiveXObject("Shell.Application").ShellExecute("cmd.exe", "/D /Q /C pushd \""+WScript.Arguments(0)+"\" & \""+WScript.Arguments(1)+"\" %sqlinstance% \""+WScript.Arguments(2)+"\"", "", "runas"); >"%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    call "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" "%cd%" %0 "%sqllogin%" 
    del "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    goto :EOF 
    :continue 
    rem 
    rem determine if the SQL service is running 
    rem 
    set srvstarted=0 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    rem 
    rem if required, stop the SQL service 
    rem 
    if .%srvstate% == .1 goto startm 
    set srvstarted=1 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    :startm 
    rem 
    rem start the SQL service with the '-m' option (single admin connection) and wait until its STATE is '4' (STARTED) 
    rem also use trace flags as follows: 
    rem     3659 - log all errors to errorlog 
    rem     4010 - enable shared memory only (lpc:) 
    rem     4022 - do not start autoprocs 
    rem 
    @echo Start the '%sqlservice%' service in maintenance mode ... 
    sc start %sqlservice% -m -T3659 -T4010 -T4022 >nul 
    if errorlevel 1 goto startmerror 
    :checkstate1 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    if .%srvstate% == .1 goto startmerror 
    if NOT .%srvstate% == .4 goto checkstate1 
    rem 
    rem add the specified user to the sysadmin role 
    rem access tempdb to avoid a misleading shutdown error 
    rem 
    @echo Add '%sqllogin%' to the 'sysadmin' role ... 
    for /F "usebackq tokens=1,3" %%i in (`sqlcmd -S np:\\.\pipe\SQLLocal\%sqlinstance% -E -Q "create table #foo (bar int); declare @rc int; execute @rc = sp_addsrvrolemember '$(sqllogin)', 'sysadmin'; print 'RETURN_CODE : '+CAST(@rc as char)"`) do if .%%i == .RETURN_CODE set sqlresult=%%j 
    rem 
    rem stop the SQL service 
    rem 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    if .%srvstarted% == .0 goto exit 
    rem 
    rem start the SQL service for normal connections 
    rem 
    net start %sqlservice% 
    if errorlevel 1 goto starterror 
    goto exit 
    rem 
    rem handle unexpected errors 
    rem 
    :existerror 
    sc query %sqlservice% 
    @echo '%sqlservice%' service is invalid 
    goto exit 
    :queryerror 
    @echo 'sc query %sqlservice%' failed 
    goto exit 
    :stoperror 
    @echo 'net stop %sqlservice%' failed 
    goto exit 
    :startmerror 
    @echo 'sc start %sqlservice% -m' failed 
    goto exit 
    :starterror 
    @echo 'net start %sqlservice%' failed 
    goto exit 
    :exit 
    if .%sqlresult% == .0 (@echo '%sqllogin%' was successfully added to the 'sysadmin' role.) else (@echo '%sqllogin%' was NOT added to the 'sysadmin' role: SQL return code is %sqlresult%.) 
    endlocal 
    pause

2
Đã làm cho tôi. Một điều cần lưu ý, hãy đảm bảo rằng bạn có phần mở rộng .js được ánh xạ tới Microsoft ® Windows Based Script Hostnếu không thì voodoo này sẽ không hoạt động (tôi đã ánh xạ tới notepad.exe).
Phil Cooper

2
Các liên kết đã chết - "Thư viện Lưu trữ đã ngừng hoạt động".
stuartd

3
@stuartd - thêm kịch bản
Chris Gessler

nếu bạn đang gặp sự cố khi thêm mình làm quản trị viên bằng cách sử dụng tập lệnh trên. Hãy thử thêm thông tin đăng nhập của bạn vào cơ sở dữ liệu và sau đó chạy tập lệnh.
Ram

2
Ai đó đã thêm cái này vào GitHub. Tập lệnh này là một trình tiết kiệm thời gian thực. gist.github.com/wadewegner/1677788
Patrick

6

Microsoft đã có một bài báo về vấn đề này. Nó đi qua tất cả từng bước.

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/connect-to-sql-server-when-system-administrators-are-locked-out

Tóm lại, nó liên quan đến việc khởi động phiên bản sqlserver -mgiống như tất cả các câu trả lời khác được đề xuất. Tuy nhiên Microsoft cung cấp hướng dẫn chi tiết hơn một chút.

Từ trang Bắt đầu, hãy khởi động SQL Server Management Studio. Trên menu Xem, chọn Máy chủ đã Đăng ký. (Nếu máy chủ của bạn chưa được đăng ký, hãy bấm chuột phải vào Nhóm máy chủ cục bộ, trỏ chuột đến Nhiệm vụ, sau đó bấm Đăng ký máy chủ cục bộ.)

Trong khu vực Máy chủ đã Đăng ký, bấm chuột phải vào máy chủ của bạn, sau đó bấm Trình quản lý Cấu hình Máy chủ SQL. Thao tác này sẽ yêu cầu quyền chạy với tư cách quản trị viên, sau đó mở chương trình Trình quản lý cấu hình.

Đóng Management Studio.

Trong Trình quản lý Cấu hình Máy chủ SQL, ở ngăn bên trái, chọn Dịch vụ Máy chủ SQL. Trong ngăn bên phải, tìm phiên bản SQL Server của bạn. (Phiên bản mặc định của SQL Server bao gồm (MSSQLSERVER) sau tên máy tính. Các phiên bản được đặt tên sẽ xuất hiện ở dạng chữ hoa với cùng tên mà chúng có trong Máy chủ đã Đăng ký.) Bấm chuột phải vào phiên bản SQL Server, rồi bấm Thuộc tính.

Trên tab Tham số Khởi động, trong hộp Chỉ định tham số khởi động, hãy nhập -m rồi bấm Thêm. (Đó là một dấu gạch ngang sau đó viết thường chữ m.)

Ghi chú

Đối với một số phiên bản SQL Server cũ hơn, không có tab Tham số khởi động. Trong trường hợp đó, trên tab Nâng cao, bấm đúp vào Tham số Khởi động. Các thông số mở ra trong một cửa sổ rất nhỏ. Hãy cẩn thận không thay đổi bất kỳ tham số hiện có nào. Cuối cùng, hãy thêm một tham số mới; -m và sau đó bấm OK. (Đó là dấu chấm phẩy rồi đến dấu gạch ngang rồi đến chữ cái viết thường m.)

Bấm OK, và sau thông báo khởi động lại, bấm chuột phải vào tên máy chủ của bạn, sau đó bấm Khởi động lại.

Sau khi SQL Server khởi động lại, máy chủ của bạn sẽ ở chế độ một người dùng. Đảm bảo rằng SQL Server Agent không chạy. Nếu bắt đầu, nó sẽ mất kết nối duy nhất của bạn.

Trên màn hình bắt đầu của Windows 8, nhấp chuột phải vào biểu tượng của Management Studio. Ở cuối màn hình, chọn Chạy với tư cách quản trị viên. (Điều này sẽ chuyển thông tin đăng nhập quản trị viên của bạn cho SSMS.)

Ghi chú

Đối với các phiên bản Windows cũ hơn, tùy chọn Chạy với tư cách quản trị viên xuất hiện dưới dạng menu phụ.

Trong một số cấu hình, SSMS sẽ cố gắng tạo một số kết nối. Nhiều kết nối sẽ không thành công vì SQL Server đang ở chế độ một người dùng. Bạn có thể chọn một trong các thao tác sau để thực hiện. Làm một điều trong số sau đây.

a) Kết nối với Object Explorer bằng Xác thực Windows (bao gồm thông tin xác thực Quản trị viên của bạn). Mở rộng Bảo mật, mở rộng Đăng nhập và nhấp đúp vào thông tin đăng nhập của riêng bạn. Trên trang Vai trò máy chủ, chọn sysadmin, sau đó bấm OK.

b) Thay vì kết nối với Object Explorer, hãy kết nối với Cửa sổ Truy vấn bằng Xác thực Windows (bao gồm thông tin đăng nhập Quản trị viên của bạn). (Bạn chỉ có thể kết nối theo cách này nếu bạn không kết nối với Object Explorer.) Thực thi mã như sau để thêm thông tin đăng nhập Windows Authentication mới là thành viên của vai trò máy chủ cố định sysadmin. Ví dụ sau thêm một người dùng miền có tên CONTOSO \ PatK.

CREATE LOGIN [CONTOSO\PatK] FROM WINDOWS;   ALTER SERVER ROLE
sysadmin ADD MEMBER [CONTOSO\PatK];   

c) Nếu Máy chủ SQL của bạn đang chạy ở chế độ xác thực hỗn hợp, hãy kết nối với Cửa sổ truy vấn bằng Xác thực Windows (bao gồm thông tin xác thực Quản trị viên của bạn). Thực thi mã như sau để tạo thông tin đăng nhập Xác thực Máy chủ SQL mới là thành viên của vai trò máy chủ cố định sysadmin.

CREATE LOGIN TempLogin WITH PASSWORD = '************';   ALTER
SERVER ROLE sysadmin ADD MEMBER TempLogin;   

Cảnh báo:

Thay thế ************ bằng một mật khẩu mạnh.

d) Nếu Máy chủ SQL của bạn đang chạy ở chế độ xác thực hỗn hợp và bạn muốn đặt lại mật khẩu của tài khoản sa, hãy kết nối với Cửa sổ truy vấn bằng Xác thực Windows (bao gồm thông tin đăng nhập Quản trị viên của bạn). Thay đổi mật khẩu của tài khoản sa bằng cú pháp sau.

ALTER LOGIN sa WITH PASSWORD = '************';   Warning

Thay thế ************ bằng một mật khẩu mạnh.

Các bước sau thay đổi SQL Server trở lại chế độ nhiều người dùng. Đóng SSMS.

Trong Trình quản lý Cấu hình Máy chủ SQL, ở ngăn bên trái, chọn Dịch vụ Máy chủ SQL. Trong ngăn bên phải, bấm chuột phải vào phiên bản SQL Server, sau đó bấm Thuộc tính.

Trên tab Tham số Khởi động, trong hộp Tham số hiện có, chọn -m rồi bấm Loại bỏ.

Ghi chú

Đối với một số phiên bản SQL Server cũ hơn, không có tab Tham số khởi động. Trong trường hợp đó, trên tab Nâng cao, bấm đúp vào Tham số Khởi động. Các thông số mở ra trong một cửa sổ rất nhỏ. Loại bỏ; -m mà bạn đã thêm trước đó, sau đó bấm OK.

Bấm chuột phải vào tên máy chủ của bạn, sau đó bấm Khởi động lại.

Bây giờ bạn sẽ có thể kết nối bình thường với một trong các tài khoản hiện là thành viên của vai trò máy chủ cố định sysadmin.


2

Nó thực sự đủ để thêm -m vào các tham số khởi động trên Trình quản lý cấu hình máy chủ Sql, khởi động lại dịch vụ, đi tới ssms một hộp kiểm thêm sysadmin trên tài khoản của bạn, sau đó xóa -m khởi động lại và sử dụng như bình thường.

Tùy chọn khởi động dịch vụ công cụ cơ sở dữ liệu

-m Bắt đầu một phiên bản của SQL Server ở chế độ một người dùng.

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.