[an error occurred while processing this directive]

PostgreSQL: безопасность на уровне строк (row level security)
Некоторые базы данных, такие как 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 может просматривать или удалять только свои записи 
и вставлять или изменять записи только под своим именем.
 
21.05.2007 , Автор: FLUF
Ключи: postgresql, sql, limit, security / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / SQL и базы данных / PostgreSQL специфика / Оптимизация и администрирование PostgreSQL

[an error occurred while processing this directive]

[an error occurred while processing this directive]