На додаток до можливості додавати тригери, дозвіл ALTER TABLE також дозволяє:
- Вимкнення тригерів (уникайте аудиторської траси)
- Вимкнути обмеження (з урахуванням поганих даних)
- Змінення протипоказань (з урахуванням поганих даних)
- Зміна визначень стовпців (змінити тип даних, максимальний розмір, NULLability)
- Додайте обчислений стовпець, який викликає T-SQL UDF (це ускладнює отримання паралельного плану, який може легко пошкодити продуктивність)
Це також дозволяє видалити стовпці, але це, швидше за все, не залишиться непоміченим (оскільки, здається, ми шукаємо тут потенційні дії, які є більш оманливими, ніж шкідливими).
На щастя, ніколи не потрібно надавати цей дозвіл нікому, а також не потрібно зафіксувати це в збереженій процедурі, яка використовує EXECUTE AS
пункт (як правило, слідує 'dbo'
або OWNER
). Модульне підписання дозволяє легко абстрагувати привілейовані дії за підписаним кодом (збережені процедури, тригери, скалярні UDF та багатовиразні TVF). У мене є приклад коду, який показує, як це досягти в наступних відповідях, тут, на DBA.SE:
Різниця між цими двома відповідями - це дозвіл, наданий Користувачу, який базується на підписах. Дозвіл на надання (або роль DB, яку потрібно додати) залежить від обсягу необхідного. Якщо вам потрібен лише дозвіл для однієї таблиці, тоді надайте лише ALTER
цей стіл. Якщо дозвіл потрібен для всіх таблиць у певній схемі, тоді не надайте дозвіл окремим таблицям, а натомість надайте дозвіл самій схемі. І так далі.
Підписання модуля - це кілька додаткових кроків порівняно зі створенням схеми, спеціально для користувача ETL, або з використанням EXECUTE AS
пункту, але:
- це дійсно просто проста копія та вставка, враховуючи, що код доступний в обох відповідях, пов'язаних вище, і
- це, безумовно, найбезпечніший варіант. Це дозволяє лише цю операцію через цей фрагмент коду, і лише тим, хто отримав
EXECUTE
дозвіл на цей код. Бути власником схеми дозволяє отримати певні неявні дозволи, які не потрібні. І, використовуючи EXECUTE AS 'dbo'
або EXECUTE AS OWNER
(за умови , що власник dbo
) дасть весь процес , з цього моменту, dbo
дозволу, а не тільки збережена процедура / тригер / функція , яку ви використовували EXECUTE AS
с. Підпис модуля обмежує дозволи лише кодом, який ви підписали, а не будь-яким кодом, який викликається підписаним кодом.