2014-11-04 7 views
0

Я пытаюсь настроить SQL-уведомления на SQL Server 2008 R2, но я продолжаю получать сообщение «Не могу найти ошибку владельца указанного пользователя», как указано в статьях ниже.SQLDependency SQL Server 2008 R2

Я знаю несколько человек представили ответы на это, и я смотрел на всех различных сочетаниях, таких как

SQLDependency Caching not working

http://blogs.msdn.com/b/dataaccess/archive/2005/09/27/474447.aspx

http://keithelder.net/2009/01/20/sqldependency-and-sql-service-broker-permissions/

http://www.codeproject.com/Articles/12862/Minimum-Database-Permissions-Required-for-SqlDepen

https://social.msdn.microsoft.com/Forums/en-US/99321f54-1fef-4860-9fe9-5966a46fe582/once-for-all-right-permissions-for-sqldependency-please?forum=sqlservicebroker

https://dba.stackexchange.com/questions/47567/permissions-using-net-sqldependency

Некоторые из них используют учетную запись пользователя для разрешения и другие используют роль.

Вот скрипт, который я использую:

CREATE LOGIN risk_test WITH PASSWORD = 'Password1', CHECK_POLICY = OFF; 
GO 

CREATE USER risk_test FOR LOGIN risk_test; 
GO 

CREATE ROLE [sql_dependency] AUTHORIZATION [dbo]; 
GO 

CREATE SCHEMA [sql_dependency] AUTHORIZATION [sql_dependency] 
GO 

EXECUTE sp_addrolemember N'sql_dependency', N'risk_test'; 
GO 

ALTER USER [risk_test] WITH DEFAULT_SCHEMA=[sql_dependency] 
GO 

--Database level permissions 
GRANT SELECT TO [sql_dependency]; 
GRANT CREATE PROCEDURE TO [sql_dependency]; 
GRANT CREATE QUEUE TO [sql_dependency]; 
GRANT CREATE SERVICE to [sql_dependency]; 
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [sql_dependency]; 
GRANT VIEW DEFINITION TO [sql_dependency]; 
GRANT ALTER ON SCHEMA::sql_dependency TO [risk_test] 
GO 

--Service broker permissions 
GRANT REFERENCES ON CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] TO [sql_dependency]; 
GRANT RECEIVE ON QueryNotificationErrorsQueue TO [sql_dependency]; 
GO 

GRANT IMPERSONATE ON USER::dbo TO [risk_test]; 
GO 

Я побежал профайлер и в следующей последовательности:

select is_broker_enabled from sys.databases where database_id=db_id() 

CREATE PROCEDURE [SqlQueryNotificationStoredProcedure-778b1ff4-6d73-46d6-bee9-fc05272fe8d7] AS BEGIN BEGIN TRANSACTION; RECEIVE TOP(0) conversation_handle FROM [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7]; IF (SELECT COUNT(*) FROM [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7] WHERE message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer') > 0 BEGIN if ((SELECT COUNT(*) FROM sys.services WHERE name = 'SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7') > 0) DROP SERVICE [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7]; if (OBJECT_ID('SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7', 'SQ') IS NOT NULL) DROP QUEUE [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7]; DROP PROCEDURE [SqlQueryNotificationStoredProcedure-778b1ff4-6d73-46d6-bee9-fc05272fe8d7]; END COMMIT TRANSACTION; END 

declare @p3 uniqueidentifier 
set @p3=NULL 
exec sp_executesql N'IF OBJECT_ID(''SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7'', ''SQ'') IS NULL BEGIN CREATE QUEUE [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7] WITH ACTIVATION (PROCEDURE_NAME=[SqlQueryNotificationStoredProcedure-778b1ff4-6d73-46d6-bee9-fc05272fe8d7], MAX_QUEUE_READERS=1, EXECUTE AS OWNER); END; IF (SELECT COUNT(*) FROM sys.services WHERE NAME=''SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7'') = 0 BEGIN CREATE SERVICE [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7] ON QUEUE [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7] ([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-778b1ff4-6d73-46d6-bee9-fc05272fe8d7] TO sql_dependency_subscriber; END; END; BEGIN DIALOG @dialog_handle FROM SERVICE [SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7] TO SERVICE ''SqlQueryNotificationService-778b1ff4-6d73-46d6-bee9-fc05272fe8d7''',N'@dialog_handle uniqueidentifier output',@[email protected] output 
select @p3 

Мы не хотим, чтобы добавить элемент управления грантовую на DBO нашему пользователю поскольку это открывает дыру в безопасности. Кто-нибудь знает, чего не хватает в моем скрипте, чтобы сделать эту работу?

+0

Я могу заставить это работать, если я не использую роль, но просто использую пользователя - не знаю, почему роль не работает. –

ответ

0

http://www.codeproject.com/Articles/12862/Minimum-Database-Permissions-Required-for-SqlDepen

Имеет хороший совет:

«Очень важно, что мы создаем схему специально для [risk_test] и что мы делаем этот пользователь владельцем этой схемы мы также должны убедиться, что. схема по умолчанию этого пользователя установлена ​​на эту новую схему.Если мы этого не сделаем, тогда SqlDependency.Start попытается создать несколько очередей и хранимых процедур в схеме пользователя по умолчанию, которая является dbo.Это не сработает с [risk_test] не имеет достаточных прав для контроля dbo-схемы. Поскольку мы хотим знать, что минимальные права [risk_test] должны запускать SqlDependency.Start, мы не хотим давать ему dbo priviliges. отдельная схема гарантирует, что SqlDependency.Start может создавать необходимые объекты внутри этой схемы [risk_test] без ущерба для безопасности ».

Так что мой совет - убедитесь, что строка подключения к базе данных использует учетные данные [risk_test].

Смежные вопросы