#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. На казнь. Эта процедура существует довольно давно и перестала работать совсем недавно.