Я с трудом пытаюсь понять это.Я использую OPENQUERY
для выполнения хранимых процедур на связанном сервере.Мне удалось найти способ сделать это, используя следующее:
SELECT *
FROM OPENQUERY(
[LINKEDSRV\SQLSRV],
'SET FMTONLY OFF; SET NOCOUNT ON; EXEC [Database_Name_Example].Data.usp_GetNames 5,''S''')
GO
Причина, по которой я использую SET FMTONLY OFF
и SET NOCOUNT ON
, заключается в том, что, когда я попробовал приведенный выше код без них, появилось это сообщение:
Сообщение 7357, уровень 16, состояние 1, строка 1 Не удается обработать объект "EXEC [Database_Name_Example] .Data.usp_GetNames 5, 'S'".Поставщик OLE DB «SQLNCLI» для связанного сервера «LINKEDSRV \ SQLSRV» указывает, что либо у объекта нет столбцов, либо у текущего пользователя нет разрешений на этот объект.
Чтение большого количества данных в Интернете помогло мненайти ответ.Этот блог, например: http://www.sommarskog.se/share_data.html#OPENQUERY
Пока все хорошо, пока я не запутался в хранимой процедуре, использующей SELECT
и UPDATE
некоторые таблицы на связанном сервере.Когда я выполняю OPENQUERY
, я получаю результаты из оператора SELECT
, но я заметил, что он не обновляет таблицу.
Хранимая процедура выглядит следующим образом:
CREATE PROCEDURE Data.usp_GetNames (@year tinyint=NULL, @online char(1)=NULL)
if @online = 'S'
BEGIN
select nam_codig, nam_desc from Names
where nam_status = 'P'
order by nam_date
UPDATE Names
SET nam_status = 'S'
where nam_status = 'P'
END
Когда я выполняю его непосредственно на связанном сервере, он обновляет таблицу, поэтому во второй раз, когда я его выполняю, не будет больше nam_status = 'P'
Но если я выполню его с OPENQUERY
, результаты будут такими же, это не UPDATE
, это просто выбор данных.
Что я могу сделать, чтобы разрешить разрешения?
Спасибо !!!