Row-Level Security в РСУБД
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: в контакте сообщения, контрольная по алгебре
| Добавил(а) на сайт: Korablin.
Предыдущая страница реферата | 1 2 3 4 5 6 7 8 9 10 | Следующая страница реферата
Точно так же, как и для запросов Select, мы должны вычислить предикат безопасности для каждой из строк, которые пользователь попытается модифицировать. Нам нужно сообщить пользователю об ошибке, а также позаботиться о неизбежной отмене результатов некорректного действия. Этого можно добиться, применяя триггеры.
В слеующих примерах выражение <Security_Check_Ok> означает предикат, аналогичный рассмотренным выше. Как и для select, предикат может быть представлять либо естественное, либо динамическое ограничение.
Для естественных ограничений принципиально важны два предиката: условие, которое проверяет состояние данных до изменения, и отдельное условие, которое проверяет состояние данных после изменения. Первое условие необходимо проверять в триггерах на удаление и изменение записей, а второе – в триггерах на изменение и вставку записей. Может появиться искушение использовать более сложные правила для изменения данных, однако делать этого обычно не стоит. Слишком легко получить нецелостную схему безопасности, которая позволяет пользователю получить различные результаты в зависимости от порядка действий. Например, запрет на увеличение суммы заказа более чем на 500 рублей (в один прием) легко обходится путем последовательного неоднократного увеличения суммы. А запрет на удаление заказов VIP-клиента, не сопровожденный запретом на изменение таких заказов, может привести к искушению просто «переписать» заказ на другого клиента.
Для динамических ограничений придется хранить чуть больше информации, чтобы учесть возможность раздельного предоставления прав на различные типы модификаций.
Примерно так будут выглядеть наши триггеры на T-SQL:
Delete
create trigger CheckSecurity on <table_name> for delete as if exists (select * from deleted where not <Security_Check_Ok>) begin RAISERROR ('Access denied', 16, 1) ROLLBACK TRANSACTION end |
Insert
create trigger CheckSecurity on <table_name> for insert as if exists (select * from inserted where not <Security_Check_Ok>) begin RAISERROR ('Access denied', 16, 1) ROLLBACK TRANSACTION end |
Update
Этот пример чуть-чуть сложнее, т.к. нам надо проверить не только старые, но и новые значения в таблице:
create trigger CheckSecurity on <table_name> for insert as Рекомендуем скачать другие рефераты по теме: оценка реферата, диплом анализ. Категории:Предыдущая страница реферата | 1 2 3 4 5 6 7 8 9 10 | Следующая страница реферата Поделитесь этой записью или добавьте в закладки |