Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
Добрый день!

Описание проблемы.
Существует веб-сервис, написанный на шарпе, он выполняет sql запросы. Алгоритм работы у него следующий - создается пользователь, выполняется запрос под этим пользователем, пользователь удаляется. Все работает как надо, но иногда при удалении пользователя вываливается исключение - Cannot drop the user 'имя юзера', because it does not exist or you do not have permission.

Вот кусочек лога
22.03.2012 22:36:06;CREATE USER t29b0d7d0cc764738afcda72f55a47a9et WITHOUT LOGIN; exec sp_addrolemember db_datareader, t29b0d7d0cc764738afcda72f55a47a9et
22.03.2012 22:36:06;Debug;DROP USER t29b0d7d0cc764738afcda72f55a47a9et;
22.03.2012 22:36:06;Error;Ошибка во время выполнения SQL запроса;"System.Data.SqlClient.SqlException (0x80131904): Cannot drop the user 't29b0d7d0cc764738afcda72f55a47a9et', because it does not exist or you do not have permission.

Непонятно почему пишет что такого пользователя нет, если запрос на создание такого пользователя выполнялся и никаких ошибок при этом не возникало? Вопрос к знатокам MS SQL, в чем тут может быть дело? Может есть ли какие-то подводные камни при создании пользователей, т.е. может ли быть такое, что пользователь не создался, но исключение на стороне клиента не возникло?

Сервер - Microsoft SQL Server Developer Edition (64-bit) 9.00.5057.00

Заранее спасибо за ответы.
23 мар 12, 08:39    [12299518]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
А как вы убедились, что пользователь does not exist? Может на самом деле you do not have permission?
В общем, берите профайлер и смотрите, что происходит на самом деле. Логи вашего приложения тут бесполезны.
23 мар 12, 08:58    [12299558]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
Если бы do not have permission, тогда бы вообще не работало. А так работает, но время от времени глючит.
23 мар 12, 09:16    [12299614]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
piton83,

Если будете придерживаться принципа "Наш веб-сервис идеален, это б***й сервер глючит!", то ничего не добьетесь.
23 мар 12, 09:24    [12299654]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1718
А если делать проверку на существование пользователя, после этого удалять?
23 мар 12, 10:40    [12300098]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
Белов Владимир
А если делать проверку на существование пользователя, после этого удалять?

Можно как вариант и так сделать.
23 мар 12, 11:01    [12300273]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
piton83
Белов Владимир
А если делать проверку на существование пользователя, после этого удалять?

Можно как вариант и так сделать.
Ага. Вместо того, чтобы найти проблему, поставим костыль и сделаем вид, что проблемы не было...
23 мар 12, 11:07    [12300332]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
invm, ну это на крайний случай.
23 мар 12, 11:13    [12300383]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
Glory
Member

Откуда:
Сообщений: 104751
кто то меняет контекст базы перед удалением ?
23 мар 12, 11:37    [12300617]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
Ситуация несколько прояснилась, проблема все-таки в создании пользователя.
Время от времени появляется такая ошибка - Transaction (Process ID ...) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Смотрю локи в профайлере, дело осложняется тем, что не так просто эту ошибку заставить сработать, сейчас, как назло, перестала вываливаться.
23 мар 12, 12:43    [12301149]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
Выловил в профайлере дедлоки, когда собираются в кучу несколько CREATE USER и DROP USER, то получается лок.
Вопрос к знатокам - как-нибудь можно дедлоки побороть или надо выкинуть само создание и удаление юзеров на каждый запрос?
23 мар 12, 15:34    [12302822]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
piton83
Выловил в профайлере дедлоки, когда собираются в кучу несколько CREATE USER и DROP USER, то получается лок.
Вопрос к знатокам - как-нибудь можно дедлоки побороть или надо выкинуть само создание и удаление юзеров на каждый запрос?
Борьба с дедлоками начинается с анализа графа.
23 мар 12, 15:36    [12302848]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
piton83, ну и все-таки интересно узнать, зачем потребовалось на каждый запрос создавать пользователя, а потом его дропать?
23 мар 12, 16:03    [12303080]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
invm
зачем потребовалось на каждый запрос создавать пользователя, а потом его дропать?


+1, сразу же подумал о том же. ТС - поясните свою логику, что/как у вас работает.
23 мар 12, 19:49    [12304426]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
гоу гёрлс
Guest
piton83
Добрый день!

Описание проблемы.
Существует веб-сервис, написанный на шарпе, он выполняет sql запросы. Алгоритм работы у него следующий - создается пользователь, выполняется запрос под этим пользователем, пользователь удаляется. Все работает как надо, но иногда при удалении пользователя вываливается исключение - Cannot drop the user 'имя юзера', because it does not exist or you do not have permission.

Вот кусочек лога
22.03.2012 22:36:06;CREATE USER t29b0d7d0cc764738afcda72f55a47a9et WITHOUT LOGIN; exec sp_addrolemember db_datareader, t29b0d7d0cc764738afcda72f55a47a9et
22.03.2012 22:36:06;Debug;DROP USER t29b0d7d0cc764738afcda72f55a47a9et;
22.03.2012 22:36:06;Error;Ошибка во время выполнения SQL запроса;"System.Data.SqlClient.SqlException (0x80131904): Cannot drop the user 't29b0d7d0cc764738afcda72f55a47a9et', because it does not exist or you do not have permission.

Непонятно почему пишет что такого пользователя нет, если запрос на создание такого пользователя выполнялся и никаких ошибок при этом не возникало? Вопрос к знатокам MS SQL, в чем тут может быть дело? Может есть ли какие-то подводные камни при создании пользователей, т.е. может ли быть такое, что пользователь не создался, но исключение на стороне клиента не возникло?

Сервер - Microsoft SQL Server Developer Edition (64-bit) 9.00.5057.00

Заранее спасибо за ответы.

create

  GO 

drop
23 мар 12, 19:59    [12304453]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
[/quot]Борьба с дедлоками начинается с анализа графа.[/quot]
В теории это понятно, на практике я ничего не понял в этом графе, кроме того, что многочисленные CREATE USER и DROP USER конкурируют за ресурсы, что в общем-то было понятно с самого начала. Где можно про это почитать? BOL ?
25 мар 12, 00:32    [12308776]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
invm
piton83, ну и все-таки интересно узнать, зачем потребовалось на каждый запрос создавать пользователя, а потом его дропать?

SamMan
invm
зачем потребовалось на каждый запрос создавать пользователя, а потом его дропать?

+1, сразу же подумал о том же. ТС - поясните свою логику, что/как у вас работает.


Идея с временными юзерами не моя, я всего лишь исполнитель злой воли свыше
Суть идеи в том, чтобы запросы выполнялись под юзером, у которого есть права только на выборку, а то какой-нить зловред отправит в сервис запрос типа "delete from VeryImportantTable". Соответственно, создается юзер, ему присваивается роль db_datareader, выполняется запрос, юзер убивается.
25 мар 12, 00:43    [12308813]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
iljy
Member

Откуда:
Сообщений: 8711
piton83
Идея с временными юзерами не моя, я всего лишь исполнитель злой воли свыше
Суть идеи в том, чтобы запросы выполнялись под юзером, у которого есть права только на выборку, а то какой-нить зловред отправит в сервис запрос типа "delete from VeryImportantTable". Соответственно, создается юзер, ему присваивается роль db_datareader, выполняется запрос, юзер убивается.

Чума... А создать постоянного пользователя, выдать ему роль db_datareader и выполнять соединения под ним не? А в вашем случае зловреду достаточно будет отправить запрос "revert; delete from VeryImportantTable".
25 мар 12, 08:44    [12309158]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
piton83
Суть идеи в том, чтобы запросы выполнялись под юзером, у которого есть права только на выборку, а то какой-нить зловред отправит в сервис запрос типа "delete from VeryImportantTable". Соответственно, создается юзер, ему присваивается роль db_datareader, выполняется запрос, юзер убивается.
Т.е. ваш веб-сервис обрабатывает произвольные пользовательские запросы или подвержен sql injection, и при этом еще и к сиквелу ходит с админскими полномочиями? Тогда можете считать, что у вас сиквел выставлен в открытый доступ и гость наделен админскими правами. И ваши пляски с пользователями не спасут, как и продемонстрировал iljy.

Отсюда возникает следующий вопрос: Для чего ходить к сиквелу с админскими правами, чтобы потом менять контекст выполнения на бесправный?

ЗЫ: Если тот, кто сидит наверху, столь дремуч, что будет упорствовать в своей ереси, то вам (если конечно есть желание прикрыть эту дыру) следует воспользоваться ролью приложения.
25 мар 12, 10:30    [12309240]     Ответить | Цитировать Сообщить модератору
 Re: Ощибка при удалении user'a  [new]
piton83
Member

Откуда:
Сообщений: 47
iljy
Чума... А создать постоянного пользователя, выдать ему роль db_datareader и выполнять соединения под ним не?

Ну что Вы! Это слишком просто, откуда тогда возьмутся трудности, которые потом придется преодолевать? :) А так получилось как нельзя лучше - у меня все работало, у тестера тоже работало, у заказчика на тесте тоже работало, а ошибки полезли на продакшене.
27 мар 12, 10:57    [12318796]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить