2016-06-27 20 views
0

Ich habe eine Anforderung, dass ich das Löschen von Tabellensätzen für alle Benutzer mit Ausnahme eines Benutzers deaktivieren muss, d. H. Benutzer1. Also habe ich Trigger verwendet, die wie folgt sind.Verhindern Löschen von Tabellensätzen für einen Benutzer und Löschen einer anderen in PostgreSQL

CREATE OR REPLACE FUNCTION prevent_deletion() RETURNS trigger AS $$ 
declare 
cur_user varchar(30); 
BEGIN 
Select current_user into cur_user; 
IF cur_user != 'user1' THEN 
RAISE EXCEPTION 'You cannot delete records from this table!'; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

Der Trigger wird verhindert Tabellensätze für Löschen von Benutzern andere als user1 was in Ordnung ist, aber es ist nicht für Benutzer user1 arbeiten. Ich meine, es löscht die Tabellensätze für Benutzer1 nicht.

Wo bin ich falsch in meinem Code?
Vielen Dank im Voraus.

+0

was ist postgres version? –

+0

https://www.postgresql.org/docs/9.5/static/sql-createpolicy.html Achten Sie auf Sicherheit auf Zeilenebene –

+0

@VaoTsun seine 9.5 – Suniel

Antwort

3

Ein Trigger, der vor dem Löschen ausgeführt wird, sollte old zurückgeben.

CREATE OR REPLACE FUNCTION prevent_deletion() 
RETURNS trigger AS $$ 
BEGIN 
    IF current_user != 'user1' THEN 
     RAISE EXCEPTION 'You cannot delete records from this table!'; 
    END IF; 
    RETURN OLD; 
END; 
$$ LANGUAGE plpgsql; 
+0

Vielen Dank für meinen dummen Fehler. – Suniel