2013-07-26 15 views
6

Zasadniczo chcę móc użyć polecenia REVOKE, aby wyłączyć UPDATE i DELETE, ale nadal chcę, aby wyzwalacze w tabeli aktualizowały moje wiersze.Czy istnieje sposób wyłączenia aktualizacji/usuwania, ale nadal pozwalają wyzwalacze, aby je wykonać?

Moje wyzwalacze działają na nowo wstawionych wierszach i aktualizują określone pole. Nadal chcę tego zachowania, ale nie będą wyłączone z REVOKE lub z RULE. (I saw an SO post)

Czy istnieje sposób, aby zachować przy użyciu poleceń UPDATE/INSERT w TRIGGERS ale wyłączając resztę?

+0

Jeśli twój wyzwalacz aktualizuje wiersze, które są wstawiane - jest to znak złego projektu. Czy możesz pokazać niektóre z twoich spustów lub powiedzieć, co z nimi robisz? –

+0

Jeśli chcesz "zaktualizować określone pole" wstawionego rekordu - możesz po prostu przypisać żądaną wartość do "NEW.specific_field". Nie potrzebujesz osobnej aktualizacji. –

+0

Nie zaprojektowałem tego, ale nie wiem, czy zrobiłbym coś lepszego, aby być szczerym. Nie spojrzałem jeszcze na wyzwalacze. Może mógłbym tego użyć, nie wiem. Dam ci znać. Dzięki – Paco

Odpowiedz

11

Tak, jest to możliwe.

Wyzwalacze działają z uprawnieniami funkcji wyzwalającej, domyślnie są to SECURITY INVOKER, co oznacza, że ​​funkcja wyzwalacza jest skutecznie wykonywana z uprawnieniami użytkownika current_user, w tym przypadku wstawiając wiersze.

Jeśli bieżący użytkownik nie ma wymaganych uprawnień dla tabel, na których działa funkcja wyzwalacza, pierwotna operacja w tabeli podstawowej spowoduje błąd.

Jednak, można użyć SECURITY DEFINER dla funkcji wyzwalania mieć ten bieg funkcji z uprawnieniami OWNER funkcji.

Jeśli masz SUPERUŻYTKOWNIK własny funkcję wyzwalania, może to zrobić wszystko - co byłoby możliwe zagrożenia bezpieczeństwa. Rozważ instrukcje zawarte w instrukcji na temat Writing SECURITY DEFINER Functions Safely.

Jednak rozsądniej jest wykonać prostą funkcję z niezbędnymi uprawnieniami OWNER funkcji wyzwalacza. Możesz nawet utworzyć rolę "demona" bez logowania, działając jako pakiet uprawnień dla takich operacji. Następnie można nadać tylko tę dostępną rolę (schematom, tabelom, sekwencjom ...) tej roli demona. Aby uzyskać bardziej wyrafinowane projekty, powinieneś zawrzeć przywileje w "rolach grupowych" (ponownie, bez logowania) i nadać te role grupowe rolom, które ich potrzebują (do roli demona w tym przykładzie), skutecznie czyniąc je "członkami grupy". Robię to bardzo.

Należy również rozważyć this related question on dba.SE dotyczące uprawnień do samej funkcji.

+0

Dzięki, że wygląda naprawdę dobrze. Podane wyjaśnienie jest świetne. Muszę to sprawdzić, kiedy będę miał szansę. Dzięki jeszcze raz :) – Paco

Powiązane problemy