Два Sql servera 7.0 один из них тестовый

Suifun
Дата: 13.10.2003 18:04:00
Извините , но такой вопрос. Был создан тестовый сервер идентичный рабочему
один к одному sql7.0.
на тестовом стали делать эксперименты, которые в последствии будут
использоваться на рабочем серваке.
В качестве обновления баз тестового сервера использовал Бакапы с рабочей
базы.
Да вот незадача.
Делая restore forse ,терялися пользовотели по доступу на базе (оно и понятно
в рабочей базе такой усер не использовался)
ну да ладно мы ручками права попишем
ан нет sql gbitn error 21002 user "vasja" already exists
так вот
Glory
Дата: 13.10.2003 18:11:45
ну да ладно мы ручками права попишем
А именно ?
Белов Владимир
Дата: 13.10.2003 18:13:42
Я вот для это написал себе вот такую процедурку


set quoted_identifier off
go
if exists(select * from dbo.sysobjects where name = 'REPAIR$Users' and xtype = 'P')
drop procedure dbo.REPAIR$Users
go
create procedure dbo.REPAIR$Users (@dbname sysname, @user varchar(4000) = null)
as
begin

set nocount on

Declare
@is_nt tinyint,
@names sysname,
@sql varchar(8000),
@sid varbinary(85)

if db_id(@dbname) is null
begin
raiserror ('Указанная БД не существует', 16, 1)
return (-1)
end

if (is_srvrolemember('sysadmin', suser_name()) <> 1) or (is_srvrolemember('securityadmin', suser_name()) <> 1)
begin
raiserror ('Недостаточно прав', 16, 1)
return(-1)
end

if object_id('tempdb..#unames') is not null
drop table #unames
create table #unames (
name varchar(128),
is_nt tinyint
)

exec sp_configure 'allow updates', 1
reconfigure with override

select @sql = "select name, isntname from " + @dbname + ".dbo.sysusers (nolock) where sid is not null " +
"and name not in ('dbo', 'guest') and name " +
case when @user is not null and @user != ''
then " in (select VARCHAR_RESULT from MANAGE.dbo.UR_StringToTable(' + @user + ', 'varchar', ';'))"
else " = name "
end

-- print @sql

insert into #unames exec(@sql)

Declare
mcur cursor local fast_forward for select name, is_nt from #unames
Open mcur
fetch next from mcur into @names, @is_nt
while @@fetch_status <> -1
begin
if @is_nt = 1
begin
select @sql = "select sid from master.dbo.syslogins where name like '%" + char(92) + @names + "'"
--print @sql

exec(@sql)
if @@rowcount > 1
print "Ошибка"
else
select @sql = "update " + @dbname + ".dbo.sysusers set sid = (select sid from master.dbo.syslogins where name like '%" + char(92) + @names + "')" +
" where name = '" + @names + "'"
end
else
select @sql = "update " + @dbname + ".dbo.sysusers set sid = (select sid from master.dbo.syslogins where name = '" + @names + "')" +
" where name = '" + @names + "'"

--print @sql

exec(@sql)
fetch next from mcur into @names, @is_nt
end
close mcur
deallocate mcur

exec sp_configure 'allow updates', 0
reconfigure with override

end

go

set quoted_identifier on

go

CREATE FUNCTION dbo.UR_StringToTable
(
@string varchar(8000),
@data_type varchar(10),
@delimiter varchar(10)
)
RETURNS @TABLE TABLE (ID int, INT_RESULT int, DATE_RESULT datetime, VARCHAR_RESULT varchar(8000))
AS
BEGIN
declare
@StartLoc int,
@EndLoc int,
@Len int,
@Val varchar(8000),
@id int

if len(@delimiter) = 0
return
select @StartLoc = 1, @EndLoc = 1, @Len = len(@string), @id = 1
while @Len > 0
begin
select @EndLoc = charindex(@delimiter, @string, @StartLoc)
if @EndLoc = 0
select @EndLoc = @Len + 1, @Len = 0
select @Val = ltrim(substring(@string, @StartLoc, @EndLoc - @StartLoc))
if @Val <> ''
begin
if upper(@data_type) = 'INT'
insert @TABLE (ID, INT_RESULT)
select @id, cast(@Val as int)
else if upper(@data_type) = 'VARCHAR'
insert @TABLE (ID, VARCHAR_RESULT)
select @id, @Val
else if upper(@data_type) = 'DATETIME'
insert @TABLE (ID, DATE_RESULT)
select @id, cast(@Val as datetime)
end
select @StartLoc = @EndLoc + len(@delimiter), @id = @id + 1
end
return
END





Suifun
Дата: 13.10.2003 18:52:56
Kak права???
mcdba
Дата: 13.10.2003 19:23:27
Мне кажется, что при переносе баз может помочь

/* sp_change_users_login '<action>', '<user>', '<login>' */

sp_change_users_login 'Update_One', 'vasja', 'vasja'
mcdba
Дата: 13.10.2003 19:34:52
!!!sp_change_users_login работает только с логинами SQL-сервера,
есть <action> = 'Report', чтобы просмотреть, что потерялось по дороге
Oldman
Дата: 14.10.2003 12:17:42
проблема в СИДах логинов. Есть такая процедура sp_help_revlogin. Запускаете ее на продукционном сервере, она вам выдает скрипт - и его надо запустить на тестовом сервере. Логины вместе с исходными СИДами будут перенесены...
Suifun
Дата: 14.10.2003 16:21:18
извините , быть может я не совсем коректно сформулировал вопрос
1. два одинаковых сервера
2. на тестововом отрабатывается новая технология
3. на тестовом создан усер вася
4. усера вася на рабочем сервере нету
5. технология на тестовом сервере с недельной давнастью базой проверерена
всё хорошо
6. хочу проверить всё с новыми данными
7. на тестовом сервере востанавливаю данные из бакапа рабочего сервера
8. естественно усера васи в востановленной базе нету
9. Иду энтерпраз манагер/секурити/логинс. добираюсь до усера васи и пытаюся дать ему дать ему права на только что востановленную базу
10. в результате получаю ошибку описанную выше
11. Самое интересное что если удалить ползователя ( зная его права
потом пытаться его сделать этого пользователя (логин такой же)
это не удаётся eroor 21008 login exist ( это другой вопрос)
12. вот такие дела sql пачал изучать недавно
mcdba
Дата: 14.10.2003 20:18:19
а если все-таки в QA запустить

use старая_база

go
exec sp_change_users_login 'Update_One', 'vasja', 'vasja'
go
use новая_база
go
exec sp_change_users_login 'Update_One', 'vasja', 'vasja'
go
mcdba
Дата: 14.10.2003 20:22:48
да что я напрягаюсь, подробно там

http://support.microsoft.com/default.aspx?scid=kb;en-us;274188&Product=sql

PRB: "Troubleshooting Orphaned Users" Topic in Books Online is Incomplete

http://support.microsoft.com/default.aspx?scid=kb;EN-US;240872

HOW TO: Resolve Permission Issues When You Move a Database Between Servers That Are Running SQL Server