powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
10 сообщений из 10, страница 1 из 1
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046795
RedBird
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В проекте на C# есть код инициализации SqlDependency :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
 connection.Open();

  //Создать команду
  SqlCommand cmd = new SqlCommand();
  cmd.CommandText = "SELECT ... FROM ... WHERE ...";
  cmd.CommandTimeout = 4 * 60;
  cmd.Connection = connection;

  //Включить отслеживание зависимостей
  SqlDependency depend = new SqlDependency(cmd/*, null, this._timeout*/);
  depend.OnChange += new OnChangeEventHandler(Dependency_OnChange);

  //Выполнить запрос
  SqlDataReader rdr = cmd.ExecuteReader();
}



В строке соединения указан SQL пользователь с ограниченным набором прав доступа.

Во время выполнения приложения возникает ошибка:
Код: plaintext
System.Data.SqlClient.SqlException (0x80131904): Cannot find the user 'owner', because it does not exist or you do not have permission.


Как показало расследование проблема возникает при выполнении динамически генерируемого скрипта:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare @p3 uniqueidentifier
set @p3='94BE88B5-DF71-EB11-82DA-708BCDBF664A'
exec sp_executesql N'
IF OBJECT_ID(''SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf'', ''SQ'') IS NULL 
BEGIN 
	CREATE QUEUE [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf] WITH ACTIVATION (PROCEDURE_NAME=[SqlQueryNotificationStoredProcedure-603d11f3-f4c0-4aab-9d10-c59f984f9ddf], MAX_QUEUE_READERS=1, EXECUTE AS OWNER); 
END; 
IF (SELECT COUNT(*) FROM sys.services WHERE NAME=''SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf'') = 0 
BEGIN 
	CREATE SERVICE [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf] ON QUEUE [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf] ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]); 
	IF (SELECT COUNT(*) FROM sys.database_principals WHERE name=''sql_dependency_subscriber'' AND type=''R'') <> 0 
	BEGIN 
		GRANT SEND ON SERVICE::[SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf] TO sql_dependency_subscriber; 
	END;  
END; 
BEGIN DIALOG @dialog_handle FROM SERVICE [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf] TO SERVICE ''SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf''',
N'@dialog_handle uniqueidentifier output',@dialog_handle=@p3 output
select @p3



А именно в конструкции:
Код: sql
1.
CREATE QUEUE [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf] WITH ACTIVATION (PROCEDURE_NAME=[SqlQueryNotificationStoredProcedure-603d11f3-f4c0-4aab-9d10-c59f984f9ddf], MAX_QUEUE_READERS=1, EXECUTE AS OWNER); 



Какое разрешение GRAND нужно выдать чтобы скрипт был бы успешно выполнен.
Разрешение
Код: sql
1.
GRANT CREATE SERVICE   TO [SqlUser];


я уже выдал.
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046862
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedBird,

у пользователя должно быть право ALTER на схему в которой создается очередь.
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046870
RedBird
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
RedBird,

у пользователя должно быть право ALTER на схему в которой создается очередь.


Добавил
Код: sql
1.
GRANT ALTER ANY SCHEMA TO [SqlUser];


Ошибка та же:
Cannot find the user 'owner', because it does not exist or you do not have permission.
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046873
RedBird
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Поставил
Код: sql
1.
GRANT ALTER ON SCHEMA::[dbo] TO [SqlUser];


Эффект тот же:
Код: plaintext
Cannot find the user 'owner', because it does not exist or you do not have permission.
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046874
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedBird,

что-то Вы не то делаете, почему у нас на каждый чих будет создаваться очередь?
По-моему, ее надо предварительно создать руками. Поищите справку.
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046884
RedBird
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
RedBird,

что-то Вы не то делаете, почему у нас на каждый чих будет создаваться очередь?
По-моему, ее надо предварительно создать руками. Поищите справку.


1. SqlDependency штатное средство используемое в C# для подписки на изменения в таблицах БД.

2. Каждый раз очередь не создается. Она создается приложением сразу после подключения к БД с уникальным именем.
Затем отдельный поток ждет изменений в таблице. Когда приложение завершается, то очередь уничтожается.

3. Поскольку имя очереди уникально, то это дает возможности запускать два и более экземпляров приложения, причем каждое из них может иметь свою подписку. Именно поэтому нельзя заранее создать одну статическую очередь...
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046895
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedBird,

чет у вас ругается на некоего странного пользователя 'owner'.

зайдите в ssms под своим пользователем "SqlUser"
и вручную выполните команду:
Код: sql
1.
2.
CREATE QUEUE [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf]; 
DROP QUEUE  [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf];



если пройдет то выполните
Код: sql
1.
CREATE QUEUE [SqlQueryNotificationService-603d11f3-f4c0-4aab-9d10-c59f984f9ddf] WITH ACTIVATION (PROCEDURE_NAME=[SqlQueryNotificationStoredProcedure-603d11f3-f4c0-4aab-9d10-c59f984f9ddf], MAX_QUEUE_READERS=1, EXECUTE AS OWNER);




да, я еще забыл для инстуркции CREATE QUEUE помимо alter на схему еще есть право на создание самой очереди
Код: sql
1.
grant CREATE QUEUE to [SqlUser]


но он вам ругается не так как должен когда нет права на создание очереди.
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046903
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аааа все я торможу.

У Вас же там процедурка активации with execute as owner

в таком случае у вас пользователь создающий очередь должен обладать правом impersonate на владельца схемы в которой живет очередь

поскольку явно схему вы не указываете, предполагаю что у вас очередь создается в схеме dbo, соответственно это владелец базы данных
Код: sql
1.
grant impersonate on user::dbo to [SqlUser]



но учтите что это "жирное право", по сути вы открываете ящик пандоры для такого пользователя.

я бы посоветовал на вашем месте задуматься о процедуре "прослойке" в которую будут передаваться необходимые параметры, а разрешения будут наследоваться.
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046911
RedBird
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

ОГОРОМНОЕ СПАСИБО!!!
...
Рейтинг: 0 / 0
Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
    #40046959
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedBird,

если для [SqlUser] не указана схема по умолчанию (dbo), то он будет пытаться создавать объекты в схеме, совпадающей с его именем. Может быть проблема в этом.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Права в БД для SQL пользователя, использующего SqlDependency в проекте C#
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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