Используйте подпись кода. Все ваши «повышенные» операции выполняются из хранимых процедур, которые подписаны, а доверие основано на подписи процедуры. Это довольно эффективно и мощно, и чрезвычайно безопасно. Например, скажем, вам нужен способ, я не знаю, создать очередь и службу, связанную с контрактом http://schemas.microsoft.com/SQL/Notifications/PostEventNotification
. Поэтому вам нужно запустить следующий код:
create queue myQueue;
create service myService on queue myQueue (
[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
Это заявление потребует повышенных разрешений: CREATE QUEUE, CREATE SERVICE и ССЫЛКА на контракт EN. Вы можете встроить эти операторы в процедуру, подписать процедуру, создать пользователя из сертификата, использованного для подписания процедуры, а затем предоставить необходимые привилегии пользователю, полученному из сертификата:
create procedure usp_createQueueAndService
with execute as caller
as
begin
create queue myQueue;
create service myService on queue myQueue (
[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
end
go
create certificate [certificateToSign_usp_createQueueAndService]
ENCRYPTION BY PASSWORD = 'Password#1234'
with subject = 'Code signing for usp_createQueueAndService';
go
ADD SIGNATURE TO OBJECT::[usp_createQueueAndService]
BY CERTIFICATE [certificateToSign_usp_createQueueAndService]
WITH PASSWORD = 'Password#1234';
go
ALTER CERTIFICATE [certificateToSign_usp_createQueueAndService]
REMOVE PRIVATE KEY;
GO
create user [certificateDerivedUser_usp_createQueueAndService]
from certificate [certificateToSign_usp_createQueueAndService];
go
grant create queue to [certificateDerivedUser_usp_createQueueAndService];
grant create service to [certificateDerivedUser_usp_createQueueAndService];
grant references on
contract::[http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]
to [certificateDerivedUser_usp_createQueueAndService];
go
Это 100% пуленепробиваемая безопасность. Все абоненты, которым предоставлено разрешение EXECUTE для процедуры, теперь могут создавать очередь и службу, поскольку самой процедуре предоставляются необходимые привилегии через подпись. Никто не может изменить процедуру, потому что ALTERing процедуры теряет подпись и, следовательно, теряет привилегии. Никто не может злоупотребить сертификатом для подписания другой процедуры, потому что закрытый ключ был утерян и утерян навсегда (закрытый ключ не нужен для проверки существующих подписей).
Эта модель может быть расширена до любых необходимых вам привилегий, включая общесерверные привилегии (хотя вместо пользователя требуется логин, полученный из сертификата, см. Процедура подписи и активации ).
Конечно, вы можете заставить usp_createQueueAndService принимать имя очереди и службы в качестве параметров, я оставил эту часть в качестве простого упражнения для читателя. Если вы хотите поиграть с уведомлениями о событиях, такие упражнения должны быть для вас тривиальными;)