Счетчик HotLog

На главнуюЧто я делаю...Программы автора и не только...Творчество
Статьи автораКнига отзывов и предложенийОбо мне, любимомФотоальбом

 
 

MS SQL Server. При создании логина генерируется ошибка

При создании пользователя сервере (что из Enterprise Manager, что из Query Analizer) командой

exec sp_grantlogin 'OurDomain\Malinkin'

вылезает ошибка:

Server: Msg 15401, Level 11, State 1, Procedure sp_grantlogin, Line 41
Windows NT user or group 'OurDomain\Malinkin' not found. Check the name again.

Ошибка, прямо скажем, непонятная. В списке логинов сервера пользователя OurDomain\Malinkin нет, пользователь такой в Active Directory есть, а сервер возвращает ошибку, что такой пользователь имеется. В чем причина? Оказалось, что пользователь OurDomain\Malinkin в домене раньше именовался по-другому и был уже зарегистрирован на сервере. Стало немного яснее, но как же генерировать пользователя так, чтобы не появлялась ошибка?

Для этого перед генерацией пользователя следует проверить, не зарегистрирован ли он уже на сервере:

if not exists(
  select
    1
  from
    master.dbo.syslogins
  where
    sid = suser_sid('OurDomain\Malinkin'))
exec sp_grantlogin 'OurDomain\Malinkin'

Теперь дам пояснения. Пользователь Windows имеет уникальный идентификатор, которым является вовсе не имя, а SID. Именно по SID происходит различение пользователей при Windows-аутентификации. Потому и проверять существование пользователя на сервере нужно не по имени, а по его SID. Еще один интересный момент: при выдаче прав пользователю на базу использовать нужно уже его действительное имя, а не то, которое прописано на сервере. То есть, если вы даете права на базу пользователю OurDomain\Malinkin, которого раньше звали OurDomain\Malina, то в процедуру sp_grantdbaccess передавать нужно OurDomain\Malinkin, несмотря на то, что прописано в таблице syslogins:

exec sp_grantdbaccess 'OurDomain\Malinkin', 'Malinkin'

Хотя запрос

select
  *
from
  master.dbo.syslogins
where
  name = 'OurDomain\Malinkin'

возвращает пустую выборку. Так происходит на MS SQL Server 2000. В версии 2005 запрос на выдачу прав срабатывает в обоих случаях.

Сказать честно, мне все равно непонятно, почему в такой ситуации генерируется такое ни о чем не говорящее исключение, разработчики из Microsoft просто поленились, в системной процедуре sp_MSaddlogin_implicit_ntlogin для любой ситуации, когда генерация невозможна, исключение одинаковое.

 
 

30.09.2008

 
     
Hosted by uCoz