MS SQL, MySQL и Linked Server
В интеграционном проекте, где некое настольное приложение являлось клиентом к Microsoft SQL Server, а один из источников данных был MySQL, требовалось организовать выполнение определённых запросов в БД-источнике (MySQL) в предписанных ситуациях, но исключить возможность выполнения там произвольных запросов пользователем. Надо понимать, что пользователь настольного приложения имеет доступ к MS SQL Server и, теоретически, может подключиться к нему с использованием другого клиента или скрипта, откуда выполнить произвольный запрос.
Решено было, что запросы к MySQL будут зашиты в хранимые процедуры на стороне SQL Server и будут выполняться через Linked Server. Нужно было обеспечить, чтобы только эти хранимые процедуры могли использовать Linked Server. То есть, пользователи не должны иметь доступ к Linked Server и не должны выполнить через Linked Server запрос иначе, кроме как запустив ХП.
Оказалось, что хранимые процедуры, объявленные WITH EXEC могут автоматически менять текущего пользователя БД (субъект безопасности уровня базы), но не логин (субъект безопасности уровня сервера). Сам Linked Server — объект уровня сервера. В итоге, автоматически получить временный субъект безопасности для удалённого запроса невозможно.
Можно обращаться к Linked Server после явного олицетворения, используя EXECUTE AS LOGIN='..' (или SETUSER при определенных условиях), но предоставление права такого олицетворения всем пользователям лишает смысла ограничения доступа.
Таким образом, исходная задача не решается.