Основная ошибка сервера в хранимой процедуре при игнорировании базы данных, указанной в ИСПОЛЬЗОВАНИИ

#sql-server #stored-procedures

Вопрос:

У меня ошибка:

Принципал сервера «ПОЛЬЗОВАТЕЛЬ1» не может получить доступ к базе данных DB2 в текущем контексте безопасности.

 USE [DB1]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[Proc1] 
With execute as 'User1'
as 
Select * from Table1
 

Как видно, процедура проста как скала, но по какой-то причине я получаю сообщение об ошибке, что ПОЛЬЗОВАТЕЛЬ1 не имеет доступа к совершенно другой DB2. В этом нет никакого смысла. Таблица 1 — находится в DB1, процедура также хранится там. У пользователя 1 тоже есть учетные данные для доступа к DB2, но они даже не нужны. Есть идеи, что может быть причиной этого и как это исправить?

Комментарии:

1. Ах, да, что я заменил исходное имя пользователя этим заполнителем.

2. Подозрительно похоже на ошибку «подключена ли эта штука». Убедитесь, что вы во всех случаях смотрите на правильный сервер, выполните select * from sys.tables where name = 'Table1' действия, чтобы убедиться, что ваша информация Table1 действительно верна (и это, скажем, не представление или синоним), и последнее, но не менее важное, проверьте наличие триггеров DDL на уровне базы данных или сервера, которые написаны неправильно.

3. База данных верна, я проверил выбранную часть, каждую таблицу, имя пользователя и набор разрешений. Попытался сменить пользователя на другого — все то же сообщение. А что касается триггеров DDL — для этого аудита БД есть только один. Так что это не должно повлиять на процедуру.

4. Чтобы уточнить, вы получаете ошибку при создании процедуры или при ее выполнении ? В первом случае триггер почти наверняка является виновной стороной (конечно, количество триггеров не имеет значения, речь идет о том, что на самом деле содержит триггер). В последнем случае это не так.

5. На казнь. Эта процедура существует довольно давно и перестала работать совсем недавно.