Сбой вызова хранимой процедуры SSRS, не удается найти пользователя dbo - PullRequest
0 голосов
/ 09 июля 2020

У меня есть отчет SSRS, который вызывает хранимую процедуру в моей базе данных.

Локально все работает, я подключаюсь с помощью Windows аутентификации локально, чтобы попасть в базу данных, и проблем нет.

Когда отчет SSRS развернут, он настроен на использование другого имени входа, и этот логин имеет правильную роль, чтобы разрешить выполнение хранимых процедур. Однако при попытке просмотреть отчет на сервере SSRS я получаю следующее сообщение:

Не удается найти пользователя dbo, потому что он не существует или у вас нет разрешения.

Если я удалю роль, которая разрешает предоставление прав на выполнение, я получаю более конкретную c ошибку, в которой говорится, что у меня нет разрешения на выполнение хранимой процедуры. Но как только эта роль будет возвращена в учетную запись пользователя, SSRS запускается по мере ее возврата go отображается ошибка

Не удается найти пользователя 'dbo'

Роль У меня есть права на выполнение, предоставленные пользователем dbo, это владелец базы данных. Я нашел в Интернете вещи, говорящие о том, что возможно, что резервная копия базы данных испортила логины некоторых пользователей. Я проверил, и sid владельца базы данных такой же, как sysuser sid для name = 'dbo', поэтому я не думаю, что это проблема.

Кто-нибудь еще знает, что я могу попробовать ?

EDIT: Подробная информация о хранимой процедуре: это простой выбор с некоторыми внутренними соединениями. В конце хранимой процедуры выполняется следующая процедура предоставления доступа к роли, в которую входит мой пользователь SSRS:

GRANT EXECUTE
    ON OBJECT::[dbo].[Application_LoadData] TO [SSRSUserRole]
    AS [dbo];

1 Ответ

2 голосов
/ 09 июля 2020

Хранимая процедура включает все операторы в пакете после CREATE PROCEDURE. Таким образом, профессионал c, подобный этому

CREATE PROCEDURE USP_FOO
AS
BEGIN
  SELECT * FROM FOO
END

GRANT EXECUTE ON USP_FOO TO SOMEUSER AS DBO;

, будет пытаться выполнить GRANT каждый раз, когда процедура запускается, и потерпит неудачу, если не будет запущен dbo.

Скрипт для создания процедура должна иметь разделитель партий перед грантом. например:

CREATE PROCEDURE USP_FOO
AS
BEGIN
  SELECT * FROM FOO
END

GO

GRANT EXECUTE ON USP_FOO TO SOMEUSER AS DBO;
...