How to map all the orphan users in sql server management studio express 2008 -
my target moved mssql databases sql server management studio express 2005 server sql server management studio express 2008 server. first created databases , users in new server via plesk panel. tried logging in database created users , able login without issues. after restore database old server not able login same database. throws following error:
create failed user 'user_name'. (microsoft.sqlserver.smo) user, group, or role 'user_name' exists in current database. (microsoft sql server, error: 15023)
i googled , found following sql query fixed problem, 1 database @ time. here query syntax
use db_name
go
exec sp_change_users_login 'update_one', 'user_name', 'login_name’
go
i have 100s of database , can't manually database. question is.. there alternative map orphan users databases?
i'm new sql please bare me , advice me on regards.
update - **
**cause of issue
so far research goes, issue sid ( ) override after restoring database source server.
initially while creating new logins assigned sid , once restore database source server, login having new sid assigned new server , database have old sid source server causes sid mismatch between login , database. resolve use above syntax override sid in database sid of login user, way both database , login have same sid.
reference: here
you can iterate through databases using sys.databases table. if statement correct , fixes problem 1 database, should databases , users
create table testtable ( tid int identity(1,1) not null, sqlstatement varchar(max) null ) go declare @dbname varchar(100) declare @sql2 varchar(max) declare @usestat nvarchar(max) declare @update varchar(10) declare @usern varchar(10) declare @loginn varchar(10) declare @quote varchar(10) declare @username varchar(25) set @update = 'update_one ' set @usern = 'user_name ' set @loginn = 'login_name ' set @quote = '''' declare db_cursor cursor select name sys.databases database_id >4 open db_cursor fetch next db_cursor @dbname while @@fetch_status = 0 begin set @sql2 = 'use '+@dbname ------------------ set @usestat = @sql2 set @usestat = ' declare @quote2 varchar(10) set @quote2 = '''''''' declare @username varchar(max) declare @statement varchar(max) declare fixusers cursor select username = name '+@dbname+'.sys.sysusers issqluser = 1 , (sid not null , sid <> 0x0) , suser_sname(sid) null order name open fixusers fetch next fixusers @username while @@fetch_status = 0 begin set @statement ='+@quote+@sql2+' go exec sp_change_users_login'+@quote+'+@quote2+'+@quote+'update_one'+@quote+'+@quote2+'+@quote+','+@quote+'+@quote2+@username+@quote2+'+@quote+','+@quote+'+@quote2+@username+@quote2+'+@quote+' go'+@quote+' print @statement fetch next fixusers @username end close fixusers deallocate fixusers' insert testtable (sqlstatement) values(@usestat) ----------------- fetch next db_cursor @dbname end close db_cursor deallocate db_cursor go declare @statement2 varchar(max) declare @tidcount int set @tidcount = 1 while @tidcount <= (select count(*) testtable) begin set @statement2 = (select sqlstatement testtable tid = @tidcount) exec (@statement2) set @tidcount = @tidcount + 1 end this give script in output. done user defined databases
Comments
Post a Comment