Technical Article

Create Database User

,

 

Give the parameter values according to your requirement.

 

Parameter Information:-

BEFORE EXECUTE SCRIPT, PLEASE CHANGE THE VALUE OF FOLLOWING

@NewUser_Name 'Put the new user name here'?

@NewUser_Password 'Put the password for new user'

@DatabaseName 'Put the database name, where you want to create user'

@NewSchema_Name 'Put the new schema name'

Note :- IF @NewSchema_Name not provided or @NewSchema_Name is null then default schema is dbo.

 

 

Please post your comments and suggestion.

 

Thanks I advance

Vinay Kumar

/*********************************************************************************************************************************

    Created ON :: April 27, 2011
    Created By :: Vinay Kumar
    Decription :: This script is used for drop and create a new or existing user.
                 IF User is already exists in database then first it will dropped and then recreate.
    
    Parameter Information:- BEFORE EXECUTE SCRIPT, PLEASE CHANGE THE VALUE OF FOLLOWING ...
    
                     @NewUser_Name        :    'Put the new user name here'
                     @NewUser_Password    :    'Put the password for new user'
                     @DatabaseName        :    'Put the database name, where you want to create user'
                     @NewSchema_Name    :    'Put the new schema name'
     
     Note :- IF @NewSchema_Name not provided or @NewSchema_Name is null then default schema is dbo.
     
     
     
EXEC [dbo].[CreateDatabaseUser]
@NewUser_Name = N'newuser',
@NewUser_Password = N'123',
@DatabaseName = N'userdatabase',
@NewSchema_Name ='newschema'


*********************************************************************************************************************************/
IF EXISTS (SELECT 1 FROM sysobjects WHERE name=N'CreateDatabaseUser' AND xtype='P')
DROP PROCEDURE [dbo].[CreateDatabaseUser]
GO

CREATE PROCEDURE [dbo].[CreateDatabaseUser]
@NewUser_Name NVARCHAR(max) = NULL,
@NewUser_Password NVARCHAR(max)= NULL,
@DatabaseName NVARCHAR(max)= NULL,
@NewSchema_Name NVARCHAR(max)= NULL
AS

SET NOCOUNT ON

DECLARE @Error_Message NVARCHAR(max)
DECLARE @SqlString NVARCHAR(max)
DECLARE @UserID int
DECLARE @TotalRow int
DECLARE @Count int
DECLARE @LoginCount int
DECLARE @TB_SchemaName Nvarchar(max)
DECLARE @AuthorizationString NVARCHAR(max)
DECLARE @RE_AuthorizationString NVARCHAR(max)

SET @SqlString=''
SET @UserID=0
SET @TotalRow=0
SET @Count=1
SET @LoginCount=1
SET @TB_SchemaName=''
SET @Error_Message=''
SET @AuthorizationString=''
SET @RE_AuthorizationString=''


SELECT @LoginCount=COUNT(*) from master.sys.sysprocesses where loginame=@NewUser_Name

IF (@LoginCount>0)
BEGIN
    RAISERROR('User is currently login. Please first close all user session(s).',16,1)
    RETURN
END

Create Table ##UserOwnerInformation
(
    [Count] int,
    UserID int,
    UserName nvarchar(max),
    SchemaID int,
    schemaName nvarchar(max)
)

SET @SqlString=N'SELECT @UserID_OUT=principal_id FROM '+@DatabaseName+'.sys.database_principals where name='''+@NewUser_Name+''''

EXEC SP_EXECUTESQL @SqlString,N'@UserID_OUT INT OUTPUT',@UserID_OUT=@UserID OUTPUT


SET @SqlString=N'
insert into ##UserOwnerInformation
SELECT ROW_NUMBER () Over(Order by UserID) AS [Count], UserID, UserName, SchemaID, SchemaName FROM(
SELECT Principal_id as UserID,USER_NAME(principal_id)as UserName,[Schema_ID] as SchemaID,name as SchemaName from '+@DatabaseName+'.sys.schemas
where Principal_id = ('+convert(varchar,@UserID)+')) as Tab_vari

'
EXEC (@SqlString)

SELECT @TotalRow = COUNT(*) FROM ##UserOwnerInformation

WHILE (@Count <= @TotalRow)
BEGIN
    SELECT @TB_SchemaName=SchemaName FROM ##UserOwnerInformation WHERE [Count] = @Count
    SET @AuthorizationString=@AuthorizationString+'ALTER AUTHORIZATION ON SCHEMA::['+@TB_SchemaName+'] TO [dbo]
    '
    SET @RE_AuthorizationString=@RE_AuthorizationString+'ALTER AUTHORIZATION ON SCHEMA::['+@TB_SchemaName+'] TO ['+@NewUser_Name+']
    '
    SET @Count= @Count+1    
END


SET @SqlString=N'
-- Drop User in database
USE ['+@DatabaseName+']

IF EXISTS (select * from '+@DatabaseName+'.sys.database_principals where name=N'''+@NewUser_Name+''')
BEGIN
    '+@AuthorizationString+'Drop USER ['+@NewUser_Name+'] 
    Print ''User Dropped From '+@DatabaseName+'''
END

'

--------


--- ========================= Check the input parameter values ========================= ---
IF NOT EXISTS(SELECT 1 FROM master.sys.sysDatabases where master.sys.sysdatabases.name=@DatabaseName)
BEGIN
    SET @Error_Message='Database doesn''t exists. Please check the database name.'    
    RAISERROR('Database doesn''t exists. Please check the database name.',16,1)
    RETURN
END

IF ((LEN(@NewUser_Name)<1 OR @NewUser_Name IS NULL) AND @Error_Message='')
BEGIN
    SET @Error_Message='Please check the @NewUser_Name parameter value.'    
END

IF ((LEN(@NewUser_Password)<1 OR @NewUser_Password IS NULL) AND @Error_Message='')
BEGIN
    SET @Error_Message='Please check the @NewUser_Password parameter value.'    
END

IF ((LEN(@DatabaseName)<1 OR @DatabaseName IS NULL) AND @Error_Message='')
BEGIN
    SET @Error_Message='Please check the @DatabaseName parameter value.'    
END

IF ((LEN(@NewSchema_Name)<1 OR @NewSchema_Name IS NULL) AND @Error_Message='')
BEGIN
    SET @NewSchema_Name='dbo'    
END

IF (@Error_Message!='')
BEGIN
    RAISERROR(@Error_Message,16,1)
    RETURN
END


-- Drop User in database
SET @SqlString=N'
USE ['+@DatabaseName+']

IF EXISTS (select * from '+@DatabaseName+'.sys.database_principals where name=N'''+@NewUser_Name+''')
BEGIN
    '+@AuthorizationString+'Drop USER ['+@NewUser_Name+']
    Print ''User Dropped From '+@DatabaseName+'''
END

'

-- Check the Login's Existence
SET @SqlString=@SqlString+N'
USE MASTER

IF EXISTS (SELECT 1 from MASTER.sys.server_principals where name =N'''+@NewUser_Name+''')
Begin
    Drop login ['+@NewUser_Name+']
    Print ''Login Dropped From Server''
END

'
--Print @SqlString
EXEC (@SqlString)

--- Create the Login if not exits
SET @SqlString=N'
USE MASTER

IF NOT EXISTS (select * from MASTER.sys.server_principals where name=N'''+@NewUser_Name+''')
BEGIN
    Create Login ['+@NewUser_Name+'] with password ='''+@NewUser_Password+''',
    Default_Database=[Master],
    Default_Language=[Us_English],
    Check_Expiration=off,
    Check_Policy=OFF
    Print ''Login Created on Server''
END

'

-- Enable the newly created Login 
SET @SqlString=@SqlString+N'
USE MASTER

IF EXISTS (select 1 from MASTER.sys.server_principals where name =N'''+@NewUser_Name+''')
BEGIN
    Alter login ['+@NewUser_Name+'] ENABLE
    Print ''Login Enabled''
END

'

--- Use The Database Where we want the relationship.
--- Check the schema, which we want to bind with login user. if not exists then create schema.
SET @SqlString=@SqlString+N'
USE ['+@DatabaseName+']

IF NOT EXISTS (Select * from '+@DatabaseName+'.sys.schemas where name=N'''+@NewSchema_Name+''')
BEGIN
    EXEC SYS.sp_Executesql N''Create Schema ['+@NewSchema_Name+']''
    print ''New Schema Created''
END

'
-- Create User in database
SET @SqlString=@SqlString+N'
USE ['+@DatabaseName+']

IF NOT EXISTS (select * from '+@DatabaseName+'.sys.database_principals where name=N'''+@NewUser_Name+''')
BEGIN
    Create USER ['+@NewUser_Name+'] FOR Login ['+@NewUser_Name+']
    '+@RE_AuthorizationString+'
    
    IF EXISTS (Select * from '+@DatabaseName+'.sys.schemas where name=N'''+@NewSchema_Name+''')
    BEGIN
        ALTER USER ['+@NewUser_Name+'] WITH DEFAULT_SCHEMA=['+@NewSchema_Name+']
        ALTER AUTHORIZATION ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    END
    Print ''User Created For '+@DatabaseName+'''
END

'
--- Give Permission to user on database
SET @SqlString=@SqlString+N'
USE ['+@DatabaseName+']

IF EXISTS (select * from '+@DatabaseName+'.sys.database_principals where name=N'''+@NewUser_Name+''')
BEGIN
    GRANT CREATE FUNCTION TO ['+@NewUser_Name+']
    GRANT CREATE PROCEDURE TO ['+@NewUser_Name+']
    GRANT CREATE TABLE TO ['+@NewUser_Name+']
    GRANT CREATE VIEW TO ['+@NewUser_Name+']
END

'

-- Privide Rights on Newly Created Schema on Database
SET @SqlString=@SqlString+N'
USE ['+@DatabaseName+']

IF EXISTS (select * from '+@DatabaseName+'.sys.schemas where name ='''+@NewSchema_Name+''')
BEGIN
    GRANT ALTER ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT CONTROL ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT DELETE ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT EXECUTE ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT INSERT ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT REFERENCES ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT SELECT ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT TAKE OWNERSHIP ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT UPDATE ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT VIEW CHANGE TRACKING ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
    GRANT VIEW DEFINITION ON SCHEMA::['+@NewSchema_Name+'] TO ['+@NewUser_Name+']
END

'
--- Auto Fix the user 
SET @SqlString=@SqlString+N'
--- Auto Fix the user 
USE ['+@DatabaseName+']

EXEC sp_change_users_login ''Auto_Fix'', '''+@NewUser_Name+''', NULL, '''+@NewUser_Password+''''

--Print @SqlString
EXEC (@SqlString)

Print '
---- New User ['+@NewUser_Name+'] Created successfully. ---'

DROP TABLE ##UserOwnerInformation

SET NOCOUNT OFF
GO

Rate

3.75 (4)

You rated this post out of 5. Change rating

Share

Share

Rate

3.75 (4)

You rated this post out of 5. Change rating