create procedure sp_adduser
@loginame       sysname,     -- user's login name in syslogins
@name_in_db     sysname = NULL, -- user's name to add to current db
@grpname sysname = NULL  -- role to which user should be added.
as
    -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
set nocount on
declare @ret        int    -- LIMIT TO SQL/NT USERS IN SYSLOGINS (BCKWRD COMPAT ONLY!)
if not exists (select * from master.dbo.syslogins where loginname = @loginame
and (isntuser = 1 or isntname = 0))
        and @loginame <> 'guest'
    begin
        raiserror(15007,-1,-1,@loginame)
        return (1)
    end -- VALIDATE THE ROLENAME --
    if @grpname is not null and
   not exists (select * from sysusers where name = @grpname and issqlrole = 1)
    begin
    raiserror(15014,-1,-1,@grpname)
    return (1)
    end    if @name_in_db is null
        select @name_in_db = @loginame -- In Hydra only the user dbo can do this --
    if (not is_member('dbo') = 1)
begin
    -- AUDIT FAILED SECURITY CHECK --
        dbcc auditevent (109, 1, 0, @loginame, @name_in_db, @grpname , NULL)
raiserror(15247,-1,-1)
return (1)
end
    else
    begin
        -- AUDIT SUCCESSFUL SECURITY CHECK --
        dbcc auditevent (109, 1, 1, @loginame, @name_in_db, @grpname , NULL)
    end    -- ADD THE USER TO THE DATABASE --
    execute @ret = sp_grantdbaccess @loginame, @name_in_db OUT
    if (@ret <> 0)
        return (1)    -- ADD USER TO ROLE IF GIVEN. NOP FOR 'public' --
    if (@grpname is not null) and (@grpname <> 'public')
    begin
        execute @ret = sp_addrolemember @grpname, @name_in_db
        if @ret <> 0
begin
-- ROLL BACK THE ABOVE sp_grantdbaccess --
if @name_in_db = 'guest'
update sysusers set status = status & ~2, updatedate = getdate()
                            where name = 'guest'
else
delete from sysusers where name = @name_in_db
            return (1)
end
    end    -- RETURN SUCCESS --
    return (0) -- sp_adduserGO