Отнемане на привилегии
Точно както ANSI предоставя командата CREATE TABLE за създаване на таблица, а не DROP TABLE, за да се отървете от нея, командата GRANT ви позволява да предоставяте привилегии на потребителите, без да предоставя начин да ги вземете обратно. Необходимостта от премахване на привилегии се свежда до командата REVOKE, която всъщност е стандартно средство с доста ясна нотация. Синтаксисът на REVOKE е подобен на GRANT, но е обърнат. За да премахнете привилегията INSERT на Адриан в таблицата с поръчки, можете да въведете
ОТМЕНЯ ВЛОЖКА ВЪРХУ поръчки ОТ Адриан;
Тук е разрешено използването на списъци с привилегии и потребители, както в случая с GRANT, така че можете да въведете следната команда:
ОТМЕНЯ ВМЪСВАНЕ, ИЗТРИВАНЕ НА Клиенти ОТ Адриан, Стивън;
Използване на изгледи за филтриране на привилегии
Можете да направите действията с привилегии по-точни, като използвате изгледи. Всеки път, когато предоставите привилегия на базова таблица на потребител, тя автоматично се разпространява към всички редове и, с възможните изключения UPDATE и REFERENCES, към всички колони на таблицата. Като създадете изглед, който препраща към основната таблица и след това прехвърлите привилегията към изгледа, а не към таблицата, можете да ограничите тези привилегии до всякакви изрази в заявката, съдържаща се в изгледа. Това значително подобрява основните възможности на командата GRANT.
Кой може да създава заявки?
За да създадете изглед, трябва да имате привилегията SELECT за всички таблици, към които препращате в изгледа. Ако изгледът е модифицируем, всички привилегии INSERT, UPDATE и DELETE, които имате в основната таблица, автоматично ще бъдат прехвърлени към изгледа. Ако ви липсва моди-fication в базови таблици, не можете да ги имате в изгледи, които сте създали, дори ако самите изгледи могат да се променят. Тъй като външни ключове не се използват в изгледи, привилегията REFERENCES никога не се използва при създаване на изгледи. Всички тези ограничения са определени от ANSI. Нестандартни системни привилегии (обсъдени по-късно в тази глава) също могат да бъдат активирани. В следващите раздели ще приемем, че създателите на изгледи, които обсъждаме, имат лични или подходящи привилегии за всички основни таблици.
ОГРАНИЧАВАНЕ НА ПРИВИЛЕГИЯТА ЗА ИЗБОР ЗА ОПРЕДЕЛЕНИ КОЛОНИ
Да приемем, че искате да дадете на потребителя на Claire възможността да вижда само колоните snum и sname на таблицата Salespersons. Можете да направите това, като поставите имената на тези колони в изгледа
СЪЗДАВАНЕ НА ИЗГЛЕД
AS SELECT snum, sname
и дайте на Клер привилегията SELECT на изгледа, а не на самата таблица на продавача:
GRANT SELECT На Clairesview на Claire;
Можете да създадете привилегии специално за колони, като използвате други привилегии, но за команда INSERT това ще означава вмъкване на стойности по подразбиране, а за команда DELETE ограничението на колоната няма да има значение. Привилегиите REFERENCES и UPDATE могат, разбира се, да направят колоните специфични, без да прибягват до изглед.
ОГРАНИЧАВАНЕ НА ПРИВИЛЕГИИ НА ОПРЕДЕЛЕНИ РЕДОВЕКато цяло, по-полезен начин за филтриране на привилегии с изгледи е използването на изглед за ограничаване на привилегиите до конкретни редове. Вие правите това естествено, като използвате предикат в изгледа, който определя кои редове са включени. За да предоставите на потребителя Adrian привилегията UPDATE втаблица с клиенти, за всички клиенти, намиращи се в Лондон, можете да създадете изглед като този:
СЪЗДАВАНЕ НА ИЗГЛЕД Londoncust
WHERE град = 'Лондон'
С ОПЦИЯ ЗА КАЧЕ;
След това трябва да дадете привилегията UPDATE на тази таблица на Adrian:
ПРЕДОСТАВЯНЕ НА АКТУАЛИЗАЦИЯ ЗА Лондонкуст НА Адриан;
Това е разликата между привилегията за конкретни редове и привилегията UPDATE за конкретни колони, която се прилага към всички колони на таблицата Клиенти, но не и към редове, сред които редове с градски пол, различен от Лондон, няма да бъдат взети под внимание. Клаузата WITH CHECK OPTION не позволява на Adrian да промени града на стойността на полето на нещо различно от Лондон.ПРЕДОСТАВЯНЕ НА ДОСТЪП САМО ДО ИЗВЛЕЧЕНИ ДАННИДруга възможност е да се предложи на потребителите достъп до данни, които вече са били извлечени, вместо действителната стойност в таблицата. Агрегираните функции могат да бъдат доста удобни по този начин. Можете да създадете изглед, който дава резултат, среден и общ резултат за поръчките за всеки ден от поръчката:
СЪЗДАВАНЕ НА ИЗГЛЕД Datetotals
AS SELECT odate, COUNT (*), SUM (amt), AVG (amt)
Сега давате на потребителя Diane привилегията SELECT в изгледа Datetotals:
ПРЕДОСТАВЯНЕ НА ИЗБОР НА Datetotals НА Даян;
ИЗПОЛЗВАНЕ НА ИЗГЛЕДИ КАТО АЛТЕРНАТИВА НА ОГРАНИЧЕНИЯТАЕдно от най-новите приложения в поредицата, описани вГлава 18е използването на изгледи с WITH CHECK OPTION като алтернатива на ограниченията. Да приемем, че искате да се уверите, че всички стойности на пола на града в таблицата „Продажби“ са в един от градовете, където вашата компания в момента има офис. Можете да зададете ограничение CHECK директно върху градската колона, но по-късноможе да стане трудно да го промените, ако вашата компания, например, отвори други отдели там. Като алтернатива можете да създадете изглед, който изключва невалидни стойности на града:
СЪЗДАВАНЕ НА ИЗГЛЕД Валути
КЪДЕ град В („Лондон“, „Рим“, „Сан Хосе“, „Берлин“)
С ОПЦИЯ ЗА КАЧЕ;
Сега, вместо да предоставяте привилегии за промяна на потребителите в таблицата Доставчици, можете да ги предоставите в изгледа Curcities. Предимството на този подход е, че ако трябва да направите промяна, можете да изтриете този изглед, да създадете нов и да предоставите привилегии на потребителите на този нов изглед, което е по-лесно от промяната на ограниченията. Недостатъкът е, че собственикът на таблицата Salespersons също трябва да използва този изглед, ако не иска собствените му команди да бъдат отхвърлени. От друга страна, този подход позволява на собственика на таблицата и всеки друг да получи привилегии за модифициране на самата таблица, а не на изгледа, за да направи изключения от ограниченията. Това често е желателно, но не е възможно, ако използвате ограничения върху основната таблица. За съжаление, тези изключения няма да се виждат в изгледа. Ако изберете този подход, ще искате да създадете втори изглед, съдържащ само изключенията:
СЪЗДАВАНЕ НА ИЗГЛЕД Други градове
КЪДЕ град НЕ Е („Лондон“, „Рим“, „Сан Хосе“,
С ОПЦИЯ ЗА КАЧЕ;
Трябва да изберете да дадете на потребителите само привилегията SELECT за този изглед, така че да могат да виждат изключените редове, но да не поставят невалидни стойности на града в основната таблица. Всъщност потребителите биха могли да заявяват и двата изгледа в обединение и да виждат всички редове наведнъж.