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

Откуда:
Сообщений: 9
Помогите разобраться с SqlDependency.
Настроил необходимые права так как написано было в статье на codeproject:
[url=]http://www.codeproject.com/Articles/12862/Minimum-Database-Permissions-Required-for-SqlDepen[/url]

Запустил я приложение, изменяю данные в БД, но вот событие OnChange никогда не возникает.
Проверил:
select * from sys.dm_qn_subscriptions

подписка есть. Когда я только поменял данные в отслеживаемой таблице - подписка исчезает и дальше ничего не происходит.
В логах Sql-сервера обнаружил следующую ошибку:
автор
Диалог уведомления о запросах для дескриптора диалога "{D986E645-B97B-E111-9CAE-00059A3C7800}." закрыт из-за следующей ошибки: "<?xml version="1.0"?><Error xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error"><Code>-8494</Code><Description>You do not have permission to access the service 'SqlQueryNotificationService-c10b057e-4c28-40fb-817b-4b1966d13ba3'.</Description></Error>".


Все что мне удалось нарыть на эту проблему так это комент одного человека на форме "[url=]http://social.msdn.microsoft.com/Forums/en-US/sqlservicebroker/thread/505778e4-be04-4673-892c-917b91872aef/[/url]"
Вот что он пишет:
автор
SqlDependency creates the temporary queue/service under the account used in the SqlDependency.Start call. But the individual notifications are created under the account used by the connection that executes the SqlCommand.Execute... If these two are different and from time to time the account calling SqlCommand.Execute... does not have the necessary permission you will get this error. An example of a scenario that exposes this problem could be a web app that starts the notifications using one fixed account (eg. the appdomain account, or a user/pwd connection string) but later when the notifications are subscribed it happens under an impersonated account. Some impersonated users may not have the necessary permission.
Unfortunately there is no solution for this. Since the temporary service name and creation /destruction are outside your control, you cannot grant SEND permissions individually on them. So, as with any problem with SqlDependency, the way to 'fix' it is to completely ditch the SqlDependency feature and go for the more basic SqlNotificationRequest Class (System.Data.Sql) that allows more granular control over what's going on. This is not something a dba can do, is an application change that has to be done by the developers.


Но если это правда то почему у человека который написал статью на codeproject все работает.
Что мне делать?
1 апр 12, 11:40    [12346915]     Ответить | Цитировать Сообщить модератору
 Re: SqlDependency не вызывает событие OnChange.  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Может Вам поможет ссылка
MSSQL 2005 – работа с очередями и асинхронная обработка данных
http://www.rsdn.ru/article/db/Yukon_Async.xml
1 апр 12, 15:19    [12347296]     Ответить | Цитировать Сообщить модератору
 Re: SqlDependency не вызывает событие OnChange.  [new]
sash_kr
Member

Откуда:
Сообщений: 9
trew,

Спасибо конечно за ссылку, но все таки хотелось бы понять почему все же таки не работает. Сейчас я склоняюсь к реализации этой идеи используя SqlNotificationRequest. Но все таки хотелось бы услышать мнение опытных людей которые работали с SqlDependency.
1 апр 12, 15:46    [12347351]     Ответить | Цитировать Сообщить модератору
 Re: SqlDependency не вызывает событие OnChange.  [new]
sash_kr
Member

Откуда:
Сообщений: 9
trew,

Спасибо конечно за ссылку, но все таки хотелось бы понять почему все же таки не работает. Сейчас я склоняюсь к реализации этой идеи используя SqlNotificationRequest. Но все таки хотелось бы услышать мнение опытных людей которые работали с SqlDependency.
1 апр 12, 15:46    [12347352]     Ответить | Цитировать Сообщить модератору
 Re: SqlDependency не вызывает событие OnChange.  [new]
sash_kr
Member

Откуда:
Сообщений: 9
не ужели никто не может мне помочь?
5 апр 12, 10:23    [12368821]     Ответить | Цитировать Сообщить модератору
 Re: SqlDependency не вызывает событие OnChange.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Не очень понятно ваше отношение к такой вещи как "Minimum DB Permissions Required for SqlDependency"?
Это я к тому - что вам надо канкретна?
Разобраться досконально и нащупать все баги (А) или что что-то как-то работало (Б)?

А. Досконально - сами и разбирайтесь, а далее отписывайтесь тута.
Б. Тупо работало - в чём проблема то? У многих нормально наботает. На форуме примеры были. (да банально 6874065 - минимальный пример)

Если чё звиняйте, я не всё внимательно всё читал (на люблю много воды в тексте, в большинстве люди не могут отделять зёрна от плевел).

А так да, "баг" очень интересный и хотелось бы подробного описания (ибо никото не нарывался). Представленный вариант пощупать руками надо, только вот времени нет.
5 апр 12, 11:05    [12369148]     Ответить | Цитировать Сообщить модератору
 Re: SqlDependency не вызывает событие OnChange.  [new]
sash_kr
Member

Откуда:
Сообщений: 9
Не прошло и полгода, а я все таки разобрался в чем дело.

Взяв пример за основу, я решил написать все роли и пользователи своими именами. Вот тут-то меня и постигла неудача.

Оказывается, дело то было в неправильном названии роли "подписчика". И только роли подписчика!!!
Название у этой роли должно быть "sql_dependency_subscriber" и никакое больше на свете.
Только вот я никак не мог понять почему. Облазил весь гугл, но нигде не встречал, чтобы кто-то строго настрого запретил обзывать ее как то иначе. И только сегодня утром наткнулся на вот эту ссылку [url=]http://blogs.msdn.com/b/dataaccess/archive/2005/09/27/474447.aspx[/url] где черным по белому написано:
автор
Call to Start refers the system views for seeing if the role sql_dependency_subscriber is available. If it is available it grants the SEND permission on the transient queue that is created to this role.
10 июл 12, 09:28    [12842583]     Ответить | Цитировать Сообщить модератору
 Re: SqlDependency не вызывает событие OnChange.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
sash_kr
Оказывается, дело то было в неправильном названии роли "подписчика".
Название у этой роли должно быть "sql_dependency_subscriber" и никакое больше.

SqlDependency changes for RTM

Спасибо за труд и что сообщили.
10 июл 12, 13:28    [12844326]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить