Некоторые базы данных, такие как MSSQL и MySQL5, имеют специальные механизмы
для разграничения доступа
пользователей к различным ресурсам БД вплоть до ячеек таблиц. PostgreSQL не
нуждается в таких излишествах.
На практике обычно требуется разграничить доступ на уровне строк. Для того, что
бы сделать это, есть простой способ,
основанный на использовании представлений, правил и функции current_user() или эквивалентного ей
ключевого слова user.
Создадим любую таблицу от имени 'postgres', в которой обязательно должно присутствовать поле
для хранения логина:
CREATE TABLE table1
(
fio text NOT NULL,
name text,
something integer,
login text,
CONSTRAINT table1_pkey PRIMARY KEY (fio)
)
WITHOUT OIDS;
ALTER TABLE table1 OWNER TO postgres;
Ни один пользователь не имеет никаких привилегий на эту таблицу.
Создадим представление, и дадим необходимым пользователям некоторые привилегии:
CREATE OR REPLACE VIEW table1v AS
SELECT table1.fio, table1.name, table1.something
FROM table1
WHERE table1.login = user;
ALTER TABLE table1v OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE table1v TO math_user;
Создадим три правила - для вставки, обновления и удаления строк из представления:
CREATE OR REPLACE RULE add AS
ON INSERT TO table1v DO INSTEAD INSERT INTO table1 (fio, name, something, login)
VALUES (new.fio, new.name, new.something, user);
CREATE OR REPLACE RULE upd AS
ON UPDATE TO table1v DO INSTEAD UPDATE table1 SET fio = new.fio, name = new.name, something = new.something, login = user
WHERE table1.login = user;
CREATE OR REPLACE RULE del AS
ON DELETE TO table1v DO INSTEAD DELETE FROM table1 where login=user;
Готово! Теперь пользователь math_user может просматривать или удалять только свои записи
и вставлять или изменять записи только под своим именем.
|