2012-07-02 9 views
12

Dla projektu wrażliwego na bezpieczeństwo, chciałbym wyłączyć DELETEs na niektórych tabelach.Wyłączyć DELETE w tabeli w PostgreSQL?

Po prostu należy ustawić flagę deleted w rzędzie (która byłaby wtedy widoczna w widoku, który byłby używany przez warstwę aplikacji).

Jak rozumiem, rule generuje dodatkowe zapytania - więc reguła nie może powstrzymać pierwotnego zapytania.

jako ilustracji przykładem zabawki z wyzwalaczem (jeszcze nie testowane):

-- data in this table should be 'undeletable' 
CREATE table article (
    id serial, 
    content text not null, 
    deleted boolean default false 
) 

-- some view that would only show articles, that are NOT deleted 
... 

-- toy trigger (not tested) 
CREATE OR REPLACE FUNCTION suppress_article_delete() 
RETURNS TRIGGER AS $sad$ 
BEGIN 
    IF (TG_OP = 'DELETE') THEN 
     UPDATE article SELECT id, content, TRUE; 
     -- NEW or NULL?? 
     RETURN NEW; 
    END IF; 
    RETURN NULL; 
END; 
$sad$ LANGUAGE plpgsql; 

Jaki byłby dobry sposób, aby stłumić DELETE?

Odpowiedz

15

Jak rozumiem, reguła generowałaby dodatkowe zapytania - więc reguła nie mogła powstrzymać pierwotnego zapytania.

Niezupełnie - to może być INSTEAD zasada:

CREATE RULE shoe_del_protect AS ON DELETE TO shoe DO INSTEAD NOTHING; 

(przykład na tej samej stronie podręcznika).

Inny sposób polega na usunięciu uprawnień z tabeli i utworzeniu procedur składowanych do usunięcia ... oraz aktualizacji i wstawieniu prawdopodobnie również.

+0

Dzięki! Chciałbym dostać ten * cofnięty * projekt do modelu danych, a nie do administracji (odwołanie) - więc domyślam się, że spróbuję reguły "INSTEAD". – miku

Powiązane problemy