SQL Server Script เพื่อสร้างผู้ใช้ใหม่


108

ฉันต้องการเขียนสคริปต์เพื่อสร้างadminผู้ใช้ (ด้วยabcdรหัสผ่าน) ใน SQL Server Express นอกจากนี้ฉันต้องการมอบหมายadminสิทธิ์แบบเต็มให้กับผู้ใช้รายนี้

คำตอบ:


210

ขึ้นอยู่กับคำถามของคุณผมคิดว่าคุณอาจจะสับสนเล็กน้อยเกี่ยวกับความแตกต่างระหว่างที่ผู้ใช้และเข้าสู่ระบบ การเข้าสู่ระบบคือบัญชีบน SQL Server โดยรวม - ผู้ที่สามารถเข้าสู่ระบบเซิร์ฟเวอร์และผู้ที่มีรหัสผ่าน ผู้ใช้เป็นเข้าสู่ระบบด้วยการเข้าถึงฐานข้อมูลที่เฉพาะเจาะจง

การสร้างการเข้าสู่ระบบเป็นเรื่องง่ายและต้องทำ (ชัดเจน) ก่อนที่จะสร้างบัญชีผู้ใช้สำหรับการเข้าสู่ระบบในฐานข้อมูลเฉพาะ:

CREATE LOGIN NewAdminName WITH PASSWORD = 'ABCD'
GO

นี่คือวิธีสร้างผู้ใช้ที่มีสิทธิ์ db_owner โดยใช้การเข้าสู่ระบบที่คุณเพิ่งประกาศ:

Use YourDatabase;
GO

IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'NewAdminName')
BEGIN
    CREATE USER [NewAdminName] FOR LOGIN [NewAdminName]
    EXEC sp_addrolemember N'db_owner', N'NewAdminName'
END;
GO

ตอนนี้เข้าสู่ระบบลื่นไหลกว่าที่ฉันทำไว้ข้างต้นเล็กน้อย ตัวอย่างเช่นบัญชีล็อกอินจะถูกสร้างขึ้นโดยอัตโนมัติ (ในการติดตั้ง SQL Server ส่วนใหญ่) สำหรับบัญชีผู้ดูแลระบบ Windows เมื่อมีการติดตั้งฐานข้อมูล ในสถานการณ์ส่วนใหญ่ฉันใช้สิ่งนั้นเมื่อฉันจัดการฐานข้อมูล (มีสิทธิ์ทั้งหมด)

อย่างไรก็ตามหากคุณกำลังจะเข้าถึง SQL Server จากแอปพลิเคชันคุณจะต้องตั้งค่าเซิร์ฟเวอร์สำหรับ "โหมดผสม" (ทั้งการเข้าสู่ระบบ Windows และ SQL) และสร้างการเข้าสู่ระบบตามที่แสดงด้านบน จากนั้นคุณจะ "GRANT" สิทธิ์ในการเข้าสู่ระบบ SQL นั้นตามสิ่งที่จำเป็นสำหรับแอปของคุณ ดูที่นี่สำหรับข้อมูลเพิ่มเติม

UPDATE: แอรอนชี้ให้เห็นถึงการใช้ sp_addsrvrolemember เพื่อกำหนดบทบาทที่เตรียมไว้ให้กับบัญชีเข้าสู่ระบบของคุณ นี่เป็นความคิดที่ดี - เร็วและง่ายกว่าการให้สิทธิ์ด้วยตนเอง หากคุณใช้ Google คุณจะเห็นลิงก์มากมาย อย่างไรก็ตามคุณยังคงต้องเข้าใจความแตกต่างระหว่างการเข้าสู่ระบบและผู้ใช้


1
สิ่งที่ฉันต้องการขอบคุณ ฉันไม่ได้คาดหวังว่ามันจะง่ายขนาดนี้ - และเพื่อให้มันทำงานได้อย่างสมบูรณ์แบบ !!
Dave

34

สิทธิ์ของผู้ดูแลระบบแบบเต็มสำหรับเซิร์ฟเวอร์ทั้งหมดหรือฐานข้อมูลเฉพาะ? ฉันคิดว่าคนอื่นตอบเรื่องฐานข้อมูล แต่สำหรับเซิร์ฟเวอร์:

USE [master];
GO
CREATE LOGIN MyNewAdminUser 
    WITH PASSWORD    = N'abcd',
    CHECK_POLICY     = OFF,
    CHECK_EXPIRATION = OFF;
GO
EXEC sp_addsrvrolemember 
    @loginame = N'MyNewAdminUser', 
    @rolename = N'sysadmin';

คุณอาจต้องปิดพารามิเตอร์ CHECK_ โดยขึ้นอยู่กับเวอร์ชันของ SQL Server Express ที่คุณใช้อยู่ ( การรวมข้อมูลนี้ในคำถามของคุณมีประโยชน์เกือบตลอดเวลา )


สิ่งที่ฉันต้องการฉันพยายามสร้างการเข้าสู่ระบบด้วย c # โดยใช้คลาส Microsoft.SqlServer.Management.Smo.Login แต่ฉันสร้างไม่ได้ ใช้งานได้กับรหัสง่ายๆใน c # ขอบคุณ
kordiseps

6

หากคุณต้องการสร้างสคริปต์ทั่วไปคุณสามารถทำได้ด้วยคำสั่ง Execute พร้อมกับแทนที่ด้วยชื่อผู้ใช้และชื่อฐานข้อมูลของคุณ

Declare @userName as varchar(50); 
Declare @defaultDataBaseName as varchar(50);
Declare @LoginCreationScript as varchar(max);
Declare @UserCreationScript as varchar(max);
Declare @TempUserCreationScript as varchar(max);
set @defaultDataBaseName = 'data1';
set @userName = 'domain\userName';
set @LoginCreationScript ='CREATE LOGIN [{userName}]
FROM WINDOWS 
WITH DEFAULT_DATABASE ={dataBaseName}'

set @UserCreationScript ='
USE {dataBaseName}
CREATE User [{userName}] for LOGIN [{userName}];
EXEC sp_addrolemember ''db_datareader'', ''{userName}'';
EXEC sp_addrolemember ''db_datawriter'', ''{userName}'';
Grant Execute on Schema :: dbo TO [{userName}];'
/*Login creation*/
set @LoginCreationScript=Replace(Replace(@LoginCreationScript, '{userName}', @userName), '{dataBaseName}', @defaultDataBaseName)
set @UserCreationScript =Replace(@UserCreationScript, '{userName}', @userName)
Execute(@LoginCreationScript)

/*User creation and role assignment*/
set @TempUserCreationScript =Replace(@UserCreationScript, '{dataBaseName}', @defaultDataBaseName)
Execute(@TempUserCreationScript)
set @TempUserCreationScript =Replace(@UserCreationScript, '{dataBaseName}', 'db2')
Execute(@TempUserCreationScript)
set @TempUserCreationScript =Replace(@UserCreationScript, '{dataBaseName}', 'db3')
Execute(@TempUserCreationScript)

ฉันได้ลดคะแนนคำตอบนี้โดยไม่ได้ตั้งใจ แต่ตอนนี้ฉันไม่สามารถยกเลิกการลงคะแนนโดยไม่แก้ไข ฉันใส่ข้อความขยะเพื่อลบ downvote ของฉัน แต่ตอนนี้ฉันไม่สามารถลบทั้งข้อความขยะหรือไม่
โหวตได้

4

คุณสามารถใช้ได้:

CREATE LOGIN <login name> WITH PASSWORD = '<password>' ; GO 

เพื่อสร้างล็อกอิน (ดูรายละเอียดเพิ่มเติมที่นี่ )

จากนั้นคุณอาจต้องใช้:

CREATE USER user_name 

ในการสร้างผู้ใช้ที่เชื่อมโยงกับการเข้าสู่ระบบสำหรับฐานข้อมูลเฉพาะที่คุณต้องการให้พวกเขาเข้าถึงด้วย

(ดูรายละเอียดที่นี่ )

คุณยังสามารถใช้:

GRANT permission  [ ,...n ] ON SCHEMA :: schema_name

เพื่อตั้งค่าสิทธิ์สำหรับสคีมาที่คุณกำหนดให้กับผู้ใช้

(ดูรายละเอียดที่นี่ )

คำสั่งอื่น ๆ อีกสองคำที่คุณอาจพบว่ามีประโยชน์คือแก้ไขผู้ใช้และแก้ไขการเข้าสู่ระบบ


3
CREATE LOGIN AdminLOGIN WITH PASSWORD = 'pass'
GO


Use MyDatabase;
GO

IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = N'AdminLOGIN')
BEGIN
    CREATE USER [AdminLOGIN] FOR LOGIN [AdminLOGIN]
    EXEC sp_addrolemember N'db_owner', N'AdminLOGIN'
    EXEC master..sp_addsrvrolemember @loginame = N'adminlogin', @rolename = N'sysadmin'
END;
GO

นี้ช่วยคุณสำหรับเครือข่ายโดยใช้:

1- Right-click on SQL Server instance at root of Object Explorer, click on Properties
Select Security from the left pane.

2- Select the SQL Server and Windows Authentication mode radio button, and click OK.

3- Right-click on the SQL Server instance, select Restart (alternatively, open up Services and restart the SQL Server service).

4- Close sql server application and reopen it

5- open 'SQL Server Configuration Manager' and tcp enabled for network

6-Double-click the TCP/IP protocol, go to the IP Addresses tab and scroll down to the IPAll section.

7-Specify the 1433 in the TCP Port field (or another port if 1433 is used by another MSSQL Server) and press the OK 

8-Open in Sql Server: Security And Login  And Right Click on Login Name And Select Peroperties And Select Server Roles And 
  Checked The Sysadmin And Bulkadmin then Ok.
9-firewall: Open cmd as administrator and type: 
      netsh firewall set portopening protocol = TCP port = 1433 name = SQLPort mode = ENABLE scope = SUBNET profile = CURRENT

0

สัปดาห์ที่ผ่านมาฉันได้ติดตั้ง Microsoft SQL Server 2014 Developer Edition ในกล่อง dev ของฉันและพบปัญหาที่ฉันไม่เคยเห็นมาก่อนในทันที

ฉันได้ติดตั้ง SQL Server เวอร์ชันต่างๆนับครั้งไม่ถ้วนและโดยปกติจะเป็นขั้นตอนที่ไม่เจ็บปวด ติดตั้งเซิร์ฟเวอร์เรียกใช้คอนโซลการจัดการมันง่ายมาก อย่างไรก็ตามหลังจากเสร็จสิ้นการติดตั้งนี้เมื่อฉันพยายามเข้าสู่เซิร์ฟเวอร์โดยใช้ SSMS ฉันได้รับข้อผิดพลาดเช่นเดียวกับด้านล่าง:

ข้อผิดพลาดในการเข้าสู่ระบบ SQL Server 18456“ การเข้าสู่ระบบล้มเหลวสำหรับผู้ใช้… (Microsoft SQL Server ข้อผิดพลาด: 18456)” ฉันเคยเห็นข้อผิดพลาดนี้หากพิมพ์รหัสผ่านผิดเมื่อเข้าสู่ระบบ - แต่นั่นก็ต่อเมื่อฉันใช้โหมดผสม ( Windows และ SQL Authentication) ในกรณีนี้เซิร์ฟเวอร์ได้รับการตั้งค่าด้วย Windows Authentication เท่านั้นและบัญชีผู้ใช้เป็นของฉันเอง ฉันยังไม่แน่ใจว่าเหตุใดจึงไม่เพิ่มผู้ใช้ของฉันในบทบาท SYSADMIN ระหว่างการตั้งค่า บางทีฉันอาจพลาดขั้นตอนและลืมเพิ่มเข้าไป ไม่ว่าอย่างไรก็ตามความหวังทั้งหมดไม่ได้สูญเสียไป

วิธีแก้ไขปัญหานี้หากคุณไม่สามารถเข้าสู่ระบบด้วยบัญชีอื่นไปยัง SQL Server ได้คือการเพิ่มการเข้าสู่ระบบเครือข่ายของคุณผ่านอินเทอร์เฟซบรรทัดคำสั่ง เพื่อให้ใช้งานได้คุณต้องเป็นผู้ดูแลระบบบน Windows สำหรับพีซีที่คุณเข้าสู่ระบบ

หยุดบริการ MSSQL เปิด Command Prompt โดยใช้ Run As Administrator เปลี่ยนเป็นโฟลเดอร์ที่เก็บไฟล์ SQL Server EXE ค่าเริ่มต้นสำหรับ SQL Server 2014 คือ“ C: \ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQLSERVER \ MSSQL \ Binn” เรียกใช้คำสั่งต่อไปนี้:“ sqlservr.exe –m” สิ่งนี้จะเริ่ม SQL Server ในโหมดผู้ใช้คนเดียว ในขณะที่เปิดพรอมต์คำสั่งนี้ไว้ให้เปิดอีกอันหนึ่งทำซ้ำขั้นตอนที่ 2 และ 3 ในหน้าต่างพรอมต์คำสั่งที่สองเรียกใช้“ SQLCMD –S Server_Name \ Instance_Name” ในหน้าต่างนี้ให้เรียกใช้บรรทัดต่อไปนี้โดยกด Enter หลังจากแต่ละบรรทัด: 1

สร้างการเข้าสู่ระบบ [domainName \ loginName] จาก WINDOWS 2 GO 3 SP_ADDSRVROLEMEMBER 'LOGIN_NAME', 'SYSADMIN' 4 GO ใช้ CTRL + C เพื่อสิ้นสุดทั้งสองกระบวนการในหน้าต่างพร้อมรับคำสั่ง คุณจะได้รับแจ้งให้กด Y เพื่อสิ้นสุดกระบวนการ SQL Server

เริ่มบริการ MSSQL ใหม่ แค่นั้นแหละ! ตอนนี้คุณควรจะสามารถเข้าสู่ระบบโดยใช้การเข้าสู่ระบบเครือข่ายของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.