Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск логина / 5 сообщений из 5, страница 1 из 1
18.11.2002, 13:09:31
    #32068939
SINys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск логина
Никто не писал процедурки/функции для определения, к каким базам имеет доступ пользователь с определенным логином? Ситуация такая. Есть у меня база для некой задачи. К ней есть прога администрирования, которая может заводить нового и удалять старых пользователей. Возможна такая ситуация, когда пользователь с одним логином работает не только с моей базой. Соответственно при удалении его из базы я срубаю его с помощью sp_revokedbaccess у себя, а далее надо проверить, если он больше ни в одной из баз не присутствует, то срубить и логин, как я понимаю с помощью sp_droplogin. Видимо нужна процедурка/функция, которая возвращала бы 0 или 1 в зависимости от того, имеет пользователь доступ к другим базам или нет. Никто подобного не писал?
Спасибо, Игорь
...
Рейтинг: 0 / 0
18.11.2002, 13:27:12
    #32068948
snake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск логина
HAS_DBACCESS
Returns information about whether the user has access to the specified database.

Syntax
HAS_DBACCESS ( 'database_name' )

Arguments
database_name

Is the name of the database for which the user wants access information. database_name is sysname.

Return Types
int

Remarks
HAS_DBACCESS returns 1 if the user has access to the database, 0 if the user has no access to the database, and NULL if the database name is invalid.

©1988-2001 Microsoft Corporation. All Rights Reserved.
...
Рейтинг: 0 / 0
18.11.2002, 13:35:26
    #32068957
SINys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск логина
Так HAS_DBACCESS проверяет только текущего пользователя. Я мне бы типа HAS_DBACCESS('database_name', 'Login')...
Списибо, Игорь
...
Рейтинг: 0 / 0
18.11.2002, 14:40:35
    #32069002
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск логина
Можно как-то так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
use tempdb
go
exec sp_MSforeachdb 
	@command1 ='USE ?; INSERT tempdb..temp1 select db_name(), a.name, b.loginname from sysusers a left outer join master..syslogins b on b.sid = a.sid where a.sid is not null', 
	@replacechar = '?', 
	@precommand = 'if exists (select * from dbo.sysobjects where id = object_id(N''tempdb..temp1'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1) DROP TABLE tempdb..temp1 
	    CREATE TABLE tempdb..temp1(dbname varchar(50), useraname varchar(50), loginname varchar(50))', 
	@postcommand = 'SELECT * FROM tempdb..temp1' 


или так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE #temp1(dbname varchar( 50 ), useraname varchar( 50 ), loginname varchar( 50 ))
declare @lastdb varchar( 50 )
set @lastdb = ''
while exists(select * from master..sysdatabases where name > @lastdb)
begin
	select @lastdb = (select top 1name from master..sysdatabases where name > @lastdb)
	exec('USE '+@lastdb+'; INSERT #temp1 select db_name(), a.name, b.loginname from sysusers a left outer join master..syslogins b on b.sid = a.sid where a.sid is not null')
end
select * from #temp1
drop table #temp1
...
Рейтинг: 0 / 0
18.11.2002, 15:09:10
    #32069029
SINys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск логина
Мне тут пришла вот какая идея. Это должно быть примерно так...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
create proc dbo.prCheckLogin
  @Login nvarchar( 256 )
as
begin
  declare @bRet bit,
          @Name nvarchar( 128 )

  declare cl cursor for select db_name(dbid)
  from master..sysdatabases for read only

  set nocount on
  set @bRet =  0 

  open cl
  fetch next from cl into @Name
  while (@@fetch_status= 0 ) 
    begin
      if @Name = db_name()
        continue
      else if exists (select * from [@Name].dbo.sysusers where sid = suser_sid(@Login) and isaliased =  0 )
        begin
          set @bRet =  1 
          break
        end
      fetch next from cl into @Name
    end
  close cl
  deallocate cl
  return @bRet
end


Вот только как подставить имя базы в select функции exists (в квадратные скобки) я никак не пойму. Может кто-нибудь подправит или есть другой вариант?

Спасибо, Игорь
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск логина / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]