У меня есть пользователь, который не может обновить хранимые процедуры, потому что он получает сообщение об ошибке INSERT не может быть выполнено в одной из наших таблиц журнала изменений. Мы проверили его разрешения на вставку в эту таблицу, и они у него есть, поэтому мы не понимали, почему он не может вставить. Когда мы углубились в это, похоже, что мы дали ему разрешение явный на вставку в таблицу, но по какой-то причине он не указывает INSERT как эффективное разрешение. Наш макет: сервер -> база данных -> таблица (довольно простая настройка).
Примечание. По какой-то причине при написании этого вопроса он продолжал интерпретировать мои вставленные изображения как код и не позволял мне публиковать встроенные изображения, поэтому мне пришлось вместо этого использовать ссылки.
Разрешения сервера Явный:
Разрешения сервера Эффективный:
Разрешения базы данных Явный:
Разрешения базы данных Эффективный:
Разрешения таблицы Явный:
Разрешения таблицы Эффективный:
При попытке ИЗМЕНИТЬ SP появляется ошибка: Msg 229, Level 14, State 5, Procedure CustomTrigger_TableA, Line 22 [Batch Start Line 7] The INSERT permission was denied on the object 'TableA', database 'DB', schema 'dbo'.
Затем, если им была дана ясность GRANT INSERT
в таблице, схеме или базе данных, я бы предположил, что где-то есть DENY
.
Пользователь входит в SSMS с учетными данными Windows. Если пользователь является частью группы / роли AD, которая препятствует INSERT, будет ли группа / роль-нарушитель видна в SSMS или мне нужно искать в другом месте? Мы предположили, что все, что нам нужно исправить, содержится исключительно в SSMS.
Каково определение DDL-триггера CustomTrigger_TableA
(это не может быть его фактическое имя)? Он использует EXECUTE AS
? Это вставка в таблицу в другой базе данных? Кроме того, SSMS - это просто пользовательский интерфейс, который предоставляет данные из SQL Server. Ничто не содержится исключительно в SSMS.
Это код для CustomTrigger_TableA
: imgur.com/a/ykrAscq
TableA
= CW_DB_Changelog
@AaronBertrand к вашему комментарию о том, что SSMS является пользовательским интерфейсом - да, извините, я просто имел в виду, что надеюсь, что все это может быть решено в домене SQL Server, и что мне не придется связываться с нашим руководителем ИТ-поддержки, чтобы изучить группу AD политики.
Не публикуйте в комментариях детали, которые должны быть в вопросе (код), и, конечно же, не размещайте код в виде изображения. Укажите код, как text
в вопросе.
И что произойдет, если вы, как системный администратор, запустите это: EXECUTE AS USER = 'Domain\TheirUsername'; GO SELECT DISTINCT permission_name FROM fn_my_permissions(N'dbo.CW_DB_ChangeLog', N'OBJECT'); GO REVERT;
(с возвратом каретки до и после каждого GO
)
Вот результаты: ALTER
CONTROL
REFERENCES
SELECT
TAKE OWNERSHIP
VIEW CHANGE TRACKING
VIEW DEFINITION
@AaronBertrand есть ли способ увидеть предоставленные / отклоненные разрешения в зависимости от роли?
Так что INSERT
явно не хватает. Для ролей, возможно, см. dba.stackexchange.com/questions/36618/…
Глядя на роли сервера, частью которых я являюсь, я вижу, что я настроен только на публичную роль. Что касается ролей базы данных, я являюсь частью db_applicationdev, db_datareader, db_datawriter, db_executor, rpt_developer.
Роль rpt_developer дает мне право INSERT для таблицы. Не уверен, что еще я могу проверить. @AaronBertrand, что ты об этом думаешь? Мы надеемся избежать необходимости предоставлять роль сервера системному администратору только для того, чтобы иметь возможность вставлять данные в эту таблицу.
Так в чем же ошибка, которую получает пользователь? Не забывайте
DENY
>GRANT
, поэтому, если пользователь является частью каких-либо групп / ролей AD, которые имеют явное разрешениеDENY
, не имеет значения, сколько раз вы предоставляете ему разрешениеGRANT
, он не сможет этого сделать.