Về cơ bản kết hợp David's answer và marc_s's answer, theo yêu cầu của một bình luận từ Chris.
Books Online nói về sp_grantdbaccess:
Tính năng này sẽ được gỡ bỏ trong một phiên bản tương lai của Microsoft SQL Server. Tránh sử dụng tính năng này trong công việc phát triển mới và lập kế hoạch để sửa đổi các ứng dụng hiện đang sử dụng tính năng này. Thay vào đó, hãy sử dụng CREATE USER.
Vì vậy, để chỉ tạo một người dùng nếu người dùng không tồn tại, tôi muốn làm một cái gì đó như thế này:
/* Make sure User is created in the appropriate database. */
USE mydb
GO
/* Users are typically mapped to logins, as OP's question implies,
so make sure an appropriate login exists. */
IF NOT EXISTS(SELECT principal_id FROM sys.server_principals WHERE name = 'foo') BEGIN
/* Syntax for SQL server login. See BOL for domain logins, etc. */
CREATE LOGIN foo
WITH PASSWORD = 'sufficiently complex password'
END
/* Create the user for the specified login. */
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = 'foo') BEGIN
CREATE USER foo FOR LOGIN foo
END
Mặc dù không được dùng nữa sp_grantdbaccess không có lợi thế là có thể sử dụng một tham số hoặc biến cục bộ cho tên người dùng/tên đăng nhập, như trong câu trả lời của David. Việc thay thế đầu tiên tôi có thể nghĩ đến để có được một cái gì đó tương tự để làm việc với CREATE USER là sử dụng SQL động. Ví dụ:
/* Make sure User is created in the appropriate database. */
USE mydb
GO
DECLARE @NewUserName sysname;
DECLARE @NewUsersLogin sysname;
SET @NewUserName = 'foo';
SET @NewUsersLogin = 'bar';
/* Users are typically mapped to logins, as OP's question implies,
so make sure an appropriate login exists. */
IF NOT EXISTS(SELECT principal_id FROM sys.server_principals WHERE name = @NewUsersLogin) BEGIN
/* Syntax for SQL server login. See BOL for domain logins, etc. */
DECLARE @LoginSQL as varchar(500);
SET @LoginSQL = 'CREATE LOGIN '+ @NewUsersLogin +
' WITH PASSWORD = ''sufficiently complex password''';
EXEC (@LoginSQL);
END
/* Create the user for the specified login. */
IF NOT EXISTS(SELECT principal_id FROM sys.database_principals WHERE name = @NewUserName) BEGIN
DECLARE @UserSQL as varchar(500);
SET @UserSQL = 'CREATE USER ' + @NewUserName + ' FOR LOGIN ' + @NewUsersLogin;
EXEC (@UserSQL);
END
Điều thú vị đủ, sách trực tuyến cũng nói rằng sp_grantdbaccess
thực sự gọi CREATE USER
, và tôi nhận thấy trong thử nghiệm của tôi rằng nếu bạn không chỉ định rõ ràng một lược đồ, sp_grantdbaccess
sẽ tạo ra một trong những tên sau khi người dùng, trong khi CREATE USER
sẽ sử dụng 'dbo' theo mặc định.
thể trùng lặp của [Kiểm tra nếu một SQL Server đăng nhập đã tồn tại] (http: // stackoverflow.com/questions/1379437/check-if-a-sql-server-login-đã tồn tại) – bummi