Правильный ответ: НЕТ , хранимая процедура не имеет доступа для записи в таблицу.Однако большинство пользователей неправильно воспринимают это как ДА из-за цепочек владения :
Когда несколько объектов базы данных последовательно обращаются друг к другу, последовательность называется цепочкой.Хотя такие цепочки не существуют независимо, когда SQL Server пересекает ссылки в цепочке, SQL Server оценивает разрешения для составляющих объектов иначе, чем если бы он обращался к объектам по отдельности.Эти различия имеют важное значение для управления безопасностью.Цепочка владения позволяет управлять доступом к нескольким объектам, таким как несколько таблиц, путем установки разрешений для одного объекта, такого как представление.
Таким образом, процедура сможет записывать в таблицу, что у пользователя нет прав на запись в , если они образуют цепочку владения .Это означает, что если владелец схемы, содержащей таблицу, совпадает с владельцем схемы, содержащей процедуру, формируется цепочка владения, и процедуре разрешается запись в таблицу.Поскольку подавляющее большинство объектов, развернутых на практике, относятся к схеме dbo
, цепочка владения почти всегда формируется.
Важно понимать эти детали, чтобы вы могли устранять неполадки и понимать , почему - процедура, разрешенная для записи в таблицу.Erland Sommarskog имеет отличную исчерпывающую информацию по этой теме: Предоставление разрешений с помощью хранимых процедур .Эта статья подробно описывает все доступные варианты.Ваш лучший вариант, намного лучше, чем цепочка владения, - подпись кода .
Понимание того, как это работает, также помогает понять, почему динамический SQL кажется «ломающимся»: запуск динамического SQL - это автоматический разрывцепочка владения, которая заставляет исчезать всю «магию».И это также помогает понять, почему эта «магия», по-видимому, не работает вне базы данных: кросс-цепочка владения дБ Опция значение по умолчанию равно 0.