Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
uaggster Member Откуда: Сообщений: 950 |
Наткнулся на интересный момент. Не могу запустить хранимую процедуру на удаленном сервере, при том, что являюсь членом роли sysadmin, делегирование служб (керберос) включено, домен один, вход под доменной авторизацией. Получаю ошибку "Linked servers cannot be used under impersonation without a mapping for the impersonated login" Внутри хранимой процедуры есть вызов хранимки с удаленного сервера, на самом деле loopback. loopback реализован так: -- Создание loopback для логгинга в отдельной транзакции IF EXISTS(SELECT * FROM sys.servers WHERE name = N'loopback') EXEC master.sys.sp_dropserver 'loopback','droplogins' go DECLARE @database VARCHAR(200) = DB_NAME(); EXEC master.dbo.sp_addlinkedserver @server = N'loopback', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=@@SERVERNAME, @catalog = @database go EXEC master.dbo.sp_serveroption loopback, 'RPC', 'TRUE' go EXEC master.dbo.sp_serveroption loopback, 'RPC OUT', 'TRUE' go EXEC master.dbo.sp_serveroption loopback, 'remote proc transaction promotion', 'FALSE' go Логирующая хранимка - вызывается так: -- логгируем действия Declare @procedure sysname; Set @procedure = Quotename(OBJECT_SCHEMA_NAME(@@PROCID)) + N'.' + Quotename(OBJECT_NAME(@@PROCID)); Declare @guid uniqueidentifier = NEWID(); EXEC loopback.[db1].[load].[ToLOG] @filial_id=@filial_id ,@guid =@guid ,@procedure=@procedure ,@action =0 Внутри ToLog - никаких изысков, просто insert into в таблицу с логами, переданных параметров. Процедура, внутри которой происходит такой вызов через loopback, объявлена With execute as owner, owner - sa. Обнаружил, что не могу вызывать такую (и подобные процедуры), на прилинкованном сервере, типа: exec [SRV-REMOTE].[db1].[load].[Эта самая говенная процедура с loopback внутри] @filial_id=@filial_id Получаю сабжевую ошибку. Заменяю loopback вызов - прямым, всё ОК. Протрахался целый день, последовательно выясняя, всё ли с видимостью, делегированием, разрешениями на сервисные логины, с паролями на сервисные логины, пока не обнаружил, что процедуры, без loopback вызова - замечательно запускаются. Разработчику, конечно, написал, чтобы убрал каку, но вопрос остался: ПОЧЕМУ??? |
11 фев 21, 16:40 [22279599] Ответить | Цитировать Сообщить модератору |
komrad Member Откуда: Сообщений: 5495 |
uaggster, а если такое добавить? EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'loopback',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL |
11 фев 21, 17:06 [22279615] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34716 Блог |
через табличные переменные и TRY-CATCH логируйте... |
11 фев 21, 17:40 [22279625] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 950 |
komrad, Попробую, завтра отпишусь. |
11 фев 21, 19:31 [22279709] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 950 |
"Мопед не мой, я только разместил объяву" (с) Мне только пару дырочек провертеть в этом пандемониуме, не более того. |
||||
11 фев 21, 19:38 [22279716] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 950 |
Нет, не помогло :-( |
||||
13 фев 21, 16:50 [22280496] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8313 |
uaggster, используйте для журналирования event notification. https://docs.microsoft.com/ru-ru/sql/t-sql/statements/create-event-notification-transact-sql?view=sql-server-2017 можно затолкать в сообщение varbinary(8000). |
13 фев 21, 17:02 [22280500] Ответить | Цитировать Сообщить модератору |
SIMPLicity_ Member Откуда: (((@))) Сообщений: 8818 |
Странно. А что видно если вот так посмотреть? К сообщению приложен файл. Размер - 106Kb |
||||||||
13 фев 21, 21:09 [22280585] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3970 |
А если пока вызвать простейшую процедуру типа принт хеллоу ворлд, что будет? |
||
13 фев 21, 22:36 [22280630] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 950 |
Владислав Колосов, спасибо, я этот метод знаю, но, в данном случае, этот вопрос - не контролирую :-( SIMPLicity_ Вот так выглядит: К сообщению приложен файл. Размер - 72Kb |
15 фев 21, 07:43 [22280917] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 950 |
Процедуры, даже не простейшие, в которых нет вызова процедур с удаленного сервера loopback - вызываются без всяких проблем. Та же самая процедура, которую я хочу вызвать, если в ней заменить вызов через удаленный сервер на локальный вызов - без проблем отрабатывает. И сама процедура, которая вызывается через удаленный сервер - тоже сродни хеллоу уорлд: -- 0 - Процедура начата -- 1 - процедура успешно завершена -- -1 - процедура завершена с ошибкой CREATE PROC [load].[ToLOG] @filial_id smallint, @guid uniqueidentifier, @procedure sysname, @action smallint, @message nvarchar(max) = NULL As BEGIN Set NOCOUNT ON; insert into [load].[log] ([guid], [date], filial_id, [procedure], [action], [message]) Values (@guid, GETDATE(), @filial_id, @procedure, @action, Try_convert(xml, @message)) END GO Разработчиком я уже написал, чтобы логировали по человечески, через переменные, например, но это дело - не быстрое, и я боюсь, что услышан - не буду. |
||||||
15 фев 21, 07:55 [22280919] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6116 |
А теукщий логин, под которым делает попытка обращения - этот самый transferer? |
||||
15 фев 21, 08:12 [22280922] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 950 |
Сон Веры Павловны, нет, логин любой. С "моей" стороны я пытаюсь написать что-то типа: CREATE PROCEDURE [load].[enqueue] @filial_id int = Null With execute as 'transferter' AS BEGIN SET NOCOUNT ON; exec [SRV002]..[load].[enqueue] @filial_id = @filial_id END GO Впрочем, оно не работает и если With execute as 'transferter' убрать, и пытаться вызвать эту хранимку под доменной учеткой, сисадмином на обоих серверах. И если убрать, но пытаться выполнится под transferter. И вообще, как угодно, если внутри удаленной процедуры [SRV002]..[load].[enqueue] есть вызов другой удаленной хранимой процедуры. transferter имеет права на запуск [load].[enqueue] на SRV002, и всё замечательно работает, если убрать внутри нее удаленный вызов (на loopback). |
15 фев 21, 08:36 [22280924] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6116 |
Это окошко настройки линкед-сервера показывает соответствие локальных логинов, под которыми делается попытка обращения, и удаленных логинов, под которыми на линкед-сервере делается вся работа. Е исли соответствия локальному логину из списка нет, то действуют приведенныt ниже опции, в данном случае - будет использоваться security context текущего логина, и именно с ним проблема. Сделайте так, как приведено на скриншоте SIMPLicity_ - установите самую последнюю опцию, Be made using this security context, вбейте в поля логин/пароль этого transferter. |
||||
15 фев 21, 10:05 [22280967] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8313 |
В качестве remote user надо попробовать указать sa с паролем, но это удар по безопасности ниже пояса. |
15 фев 21, 11:44 [22281001] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6116 |
Да зачем sa - любого, у которого есть права на выполнение того, что требуется. Ну, или, в конце концов, обращаться к линкед-серверу только под теми логинами, которые в списке маппинга. |
||||
15 фев 21, 11:57 [22281011] Ответить | Цитировать Сообщить модератору |
uaggster Member Откуда: Сообщений: 950 |
Не помогает. Когда я логинюсь как transferter, и пытаюсь выполнить обёртку - получаю ту же ошибку. Вне зависимости от того, как я переписываю процедуру обертку "With execute as 'transferter'" или без этой опции. Разумеется, transferter имеет права на запуск и обертки, и отмапленный transferter - на целевом сервере. Но если убрать вызов в процедуре на удаленном сервере вызов процедуры на прилинкованном сервере loopback - всё работает. И под отмапленным логином, и под любым логином, имеющим права на обеих серверах. |
||||||||
16 фев 21, 10:47 [22281453] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
uaggster, А попробуйте вот так -- логгируем действия Declare @procedure sysname; Set @procedure = Quotename(OBJECT_SCHEMA_NAME(@@PROCID)) + N'.' + Quotename(OBJECT_NAME(@@PROCID)); Declare @guid uniqueidentifier = NEWID(); declare @load_proc sysname = quotename(@@servername) + N'.[db1].[load].[ToLOG]'; EXEC @load_proc @filial_id=@filial_id ,@guid =@guid ,@procedure=@procedure ,@action =0 |
16 фев 21, 11:42 [22281485] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8313 |
Чтобы не было олицетворения, у автора execute as login = 'sa' в процедуре. |
||||||||
16 фев 21, 16:06 [22281692] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |