Помимо возможности добавления триггеров, разрешение ALTER TABLE также позволяет:
- Отключение триггеров (избегайте контрольного журнала)
- Отключить ограничения (с учетом неверных данных)
- Изменение ограничений (с учетом плохих данных)
- Изменение определений столбцов (изменение типа данных, максимального размера, NULLability)
- Добавьте вычисляемый столбец, который вызывает UDF T-SQL (что затрудняет получение параллельного плана, что может легко снизить производительность)
Это также позволяет удалять столбцы, но это вряд ли останется незамеченным (так как кажется, что мы ищем здесь потенциальные действия, которые являются скорее обманчивыми, чем вредоносными).
К счастью, никогда не нужно предоставлять это разрешение кому-либо, и нет необходимости заключать его в хранимую процедуру, которая использует EXECUTE AS
предложение (обычно сопровождаемое 'dbo'
или OWNER
). Подписание модуля позволяет легко абстрагировать привилегированные действия за подписанным кодом (хранимые процедуры, триггеры, скалярные UDF и TVF с несколькими операторами). У меня есть пример кода, показывающий, как это сделать, в следующих ответах, здесь, на DBA.SE:
Разница между этими двумя ответами заключается в разрешении, предоставленном пользователю на основе подписи. Разрешение, которое будет предоставлено (или роль БД, которая будет добавлена), зависит от объема того, что необходимо. Если вам нужно разрешение только для одной таблицы, то предоставьте только ALTER
эту таблицу. Если разрешение требуется для всех таблиц в конкретной схеме, не предоставляйте разрешение отдельным таблицам, а вместо этого предоставляйте разрешение самой схеме. И так далее.
Подписание модуля - это несколько дополнительных шагов по сравнению с созданием схемы специально для пользователя ETL или с использованием EXECUTE AS
предложения, но:
- это просто простое копирование и вставка, учитывая, что код доступен в обоих ответах, указанных выше, и
- это, безусловно, самый безопасный вариант. Он разрешает эту операцию только через этот фрагмент кода и только для тех, кому дано
EXECUTE
разрешение на этот код. Быть владельцем схемы позволяет определенные неявные разрешения, которые не нужны. И использование EXECUTE AS 'dbo'
или EXECUTE AS OWNER
(при условии, что владельцем является dbo
) даст весь процесс , начиная с этого момента, dbo
разрешения, а не только хранимую процедуру / триггер / функцию, которую вы использовали EXECUTE AS
. Подписание модуля ограничивает разрешения только кодом, который вы подписали, а не кодом, вызываемым подписанным кодом.