2012-07-10 3 views
0

Я пытаюсь создать скрипт, который обнаруживает, что роль уже активируется, и если она это делает, она должна аннулировать все привилегии. Это работает отлично делает это так:Обнаружить роль в Postgresql динамически

DO $$DECLARE count int; 
BEGIN 
SELECT count(*) INTO count FROM pg_roles WHERE rolname = 'superman'; 
IF count > 0 THEN 
    REVOKE ALL PRIVILEGES ON TABLE FROM superman; 
END IF; 
END$$; 

Но теперь я хочу, чтобы это быть динамичными в среду, так как я буду использовать различные имена ролей за окружающую среду. Так что я пытался использовать \ набор механизм, но это, кажется, не работает при использовании PL/SQL, так что если бы я сделал что-то вроде следующего Postgresql жалуется с синтаксическими ошибками:

/set environment _int 

DO $$DECLARE count int; 
BEGIN 
SELECT count(*) INTO count FROM pg_roles WHERE rolname = 'superman'; 
IF count > 0 THEN 
    REVOKE ALL PRIVILEGES ON TABLE FROM superman:environment; 
END IF; 
END$$; 

Хотя если бы я не сделайте это в pl/sql, аннулирование statment работает просто отлично. Поэтому мой вопрос: как я могу сделать свой сценарий динамическим, передав ему параметры, чтобы они были заменены?

ответ

1

Для динамического SQL вы должны использовать EXECUTE. Кроме того, оператор DO не может принимать параметры. Создание функции plpgsql:

CREATE OR REPLACE FUNCTION f_revoke_all_from_role(_role text) 
    RETURNS void AS 
$BODY$ 
BEGIN 

IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = _role) THEN 
    EXECUTE 'REVOKE ALL PRIVILEGES ON TABLE x FROM ' || quote_ident(_role); 
END IF; 

END; 
$BODY$ LANGUAGE plpgsql; 

вызов:

SELECT f_revoke_all_from_role('superman'); 
  • IF блок проще с EXISTS.

  • Я использую quote_ident(), чтобы избежать SQLi.

  • Имя таблицы может быть второй параметр функции ...

+0

Ах хорошо .. Thnx !! Я попробую это. Я уже боялся сделать это так. Я нахожу это странным, хотя, поскольку в Oracle можно передавать переменные извне в скрипт plsql без необходимости писать функцию. Я просто хочу эту логику, чтобы я мог развернуть мою базу данных. Почему я должен создать функцию для этого? Разве нет другого способа сделать это, как в Oracle? – Tranquilized

+0

@ user1515731: Я бы ничего не знал. Функция plpgsql, похоже, не сложна, или делает это? –

+0

Нет, это не так, но мне не нравится, что мне нужно создать функцию, чтобы определить, существует ли какая-либо роль, и в основном отбросить ее послесловие, поскольку я не буду использовать ее в своем приложении. Но я попробую это thnx за вашу помощь :-) – Tranquilized

Смежные вопросы