The following script will add users to a database by first creating a logon for the Database Server then add user entries for each of the databases you want to give access to. Also specified are the role members for each database.
Add User Using Windows Authentication
-- Create user windows Authentication CREATE LOGIN [YourDomainName\JohnJacobs] FROM WINDOWS WITH DEFAULT_DATABASE = [YourDatabaseHere]; GO -- Add User to first database USE YourDatabaseHere; CREATE USER JohnJacobs FOR LOGIN [YourDomainName\JohnJacobs]; EXEC sp_addrolemember 'db_datareader', 'JohnJacobs' EXEC sp_addrolemember 'db_datawriter', 'JohnJacobs' -- Add User to second database USE YourSecondDatabaseHere; CREATE USER JohnJacobs FOR LOGIN [YourDomainName\JohnJacobs]; EXEC sp_addrolemember 'db_datareader', 'JohnJacobs' EXEC sp_addrolemember 'db_datawriter', 'JohnJacobs'
Add User Using SQL Authentication
-- Create user for SQL Authentication CREATE LOGIN JohnJacobs WITH PASSWORD = 'JinGleHeimerSchmidt' ,DEFAULT_DATABASE = [YourDatabaseHere] GO -- Add User to first database USE YourDatabaseHere; CREATE USER JohnJacobs FOR LOGIN JohnJacobs; EXEC sp_addrolemember 'db_datareader', 'JohnJacobs' EXEC sp_addrolemember 'db_datawriter', 'JohnJacobs' GO -- Add User to second database USE YourSecondDatabaseHere; CREATE USER JohnJacobs FOR LOGIN JohnJacobs; EXEC sp_addrolemember 'db_datareader', 'JohnJacobs' EXEC sp_addrolemember 'db_datawriter', 'JohnJacobs'
To automate the creation use the script below. It will print out the statements so you can copy and paste them into SSMS.
DECLARE @UserString varchar(8000)
DECLARE @DatabaseString varchar(8000)
DECLARE @DefaultDatabase varchar(255)
DECLARE @RolesString varchar(8000)
DECLARE @delimiter char(1)
SET @UserString = '[yourdomain\youruser],[yourdomain\youruser2]'
SET @DatabaseString = 'DatabaseOne,DatabaseTwo'
SET @DefaultDatabase = 'DatabaseOne'
SET @RolesString = 'db_datareader,db_datawriter'
SET @delimiter = ','
BEGIN TRY
DROP TABLE #Users
DROP TABLE #Databases
DROP TABLE #Roles
END TRY BEGIN CATCH END CATCH
;WITH Substr(num, firstchar, lastchar) AS (
SELECT 1, 1, CHARINDEX(@delimiter, @UserString)
UNION ALL
SELECT num + 1, lastchar + 1, CHARINDEX(@delimiter, @UserString, lastchar + 1)
FROM Substr
WHERE lastchar > 0
)
SELECT
num,
UserName = SUBSTRING(@UserString, firstchar, CASE WHEN lastchar > 0 THEN lastchar-firstchar ELSE 8000 END)
INTO #Users
FROM Substr
;WITH Substr(num, firstchar, lastchar) AS (
SELECT 1, 1, CHARINDEX(@delimiter, @DatabaseString)
UNION ALL
SELECT num + 1, lastchar + 1, CHARINDEX(@delimiter, @DatabaseString, lastchar + 1)
FROM Substr
WHERE lastchar > 0
)
SELECT
num,
DatabaseName = SUBSTRING(@DatabaseString, firstchar, CASE WHEN lastchar > 0 THEN lastchar-firstchar ELSE 8000 END)
INTO #Databases
FROM Substr
;WITH Substr(num, firstchar, lastchar) AS (
SELECT 1, 1, CHARINDEX(@delimiter, @RolesString)
UNION ALL
SELECT num + 1, lastchar + 1, CHARINDEX(@delimiter, @RolesString, lastchar + 1)
FROM Substr
WHERE lastchar > 0
)
SELECT
num,
RoleName = SUBSTRING(@RolesString, firstchar, CASE WHEN lastchar > 0 THEN lastchar-firstchar ELSE 8000 END)
INTO #Roles
FROM Substr
DECLARE @NumUsers int
DECLARE @NumDBs int
DECLARE @NumRoles int
DECLARE @UserIter int
DECLARE @DBIter int
DECLARE @RoleIter int
DECLARE @UserName varchar(255)
DECLARE @RoleUserName varchar(255)
DECLARE @DBName varchar(255)
DECLARE @RoleName varchar(255)
DECLARE @SQL varchar(max)
SET @NumUsers = (SELECT MAX(num) FROM #Users)
SET @NumDBs = (SELECT MAX(num) FROM #Databases)
SET @NumRoles = (SELECT MAX(num) FROM #Roles)
SET @UserIter = 1
SET @SQL = ''
WHILE @UserIter <= @NumUsers
BEGIN
SET @DBIter = 1
SET @RoleIter = 1
SET @UserName = (SELECT UserName FROM #Users WHERE num = @UserIter)
SET @SQL = 'CREATE LOGIN ' + @UserName + ' FROM WINDOWS WITH DEFAULT_DATABASE = ' + @DefaultDatabase
PRINT (@SQL)
SET @UserIter = @UserIter + 1
-- Add user to the databases
WHILE @DBIter <= @NumDBs
BEGIN
SET @DBName = (SELECT DatabaseName FROM #Databases WHERE num = @DBIter)
SET @SQL = 'USE ' + @DBName + '; CREATE USER ' + @UserName + ' FOR LOGIN ' + @UserName
PRINT (@SQL)
SET @DBIter = @DBIter + 1
WHILE @RoleIter <= @NumRoles
BEGIN
SET @RoleName = (SELECT RoleName FROM #Roles WHERE num = @RoleIter)
-- Must remove brackets for addrolemember procedure
SET @RoleUserName = REPLACE(REPLACE(@UserName, '[', ''), ']', '')
SET @SQL = 'USE ' + @DBName + '; EXEC sp_addrolemember ''' + @RoleName + ''', ''' + @RoleUserName + ''''
PRINT (@SQL)
SET @RoleIter = @RoleIter + 1
END
END
END
Popular search terms:

Thanks for this post – really helped me to solve my problem!
This article is very useful for me to create – Request for Change (RFC) ->which will assign the role to user through script.
Great post. helped me alot after I was stuck for days
Great, glad it helped Nitesh.
Very handy page – thanks!