За последние 24 часа нас посетили 17445 программистов и 1714 роботов. Сейчас ищет 1741 программист ...

вопрос про хранимые процедуры и триггеры

Тема в разделе "PostgreSQL", создана пользователем FLUF, 8 апр 2007.

  1. FLUF

    FLUF Активный пользователь

    С нами с:
    10 мар 2007
    Сообщения:
    2
    Симпатии:
    0
    Как сделать return сразу нескольких строк?
    предположим мы обьявили в хранимой процедуре на pl/pgsql переменную как
    my_var sometable.%ROWTYPE;
    И когда я делаю select * from my_func(); я хочу, что бы результатом была целая таблица, т.е. сразу несколько строк, а не одна строка.
    можно ли вообще так сделать?

    И как запретить пользователю делать delete из таблицы в то время, когда активированный триггер delete делать может?
    Т.е. у меня есть триггер на insert прикрученный к тиблицу my_table. Если в таблицу сделать инсерт - сработает триггер, и в процессе его работы он, триггер, делает delete из этой же таблицы (my_table). А вот если delete захочет сделать пользователь, т.е. отправив запрос типа delete from my_table;, то это надо присеч, запретить. Как это сделать?
    В MSSQL есть фукнция для выевления уровня вложенности кода. В таком случае бы можно было этот триггер поставить на insert и delete, и когда бы он делал delete, он бы запускал сам себя, и по уровню вложенности кода это бы видел. И если уровень вложенности кода ноль, значит delete делает юзверь, на что ответить ему raise exception 'ни льзя'.
    Кроме того в том же MSSQL можно вообще на всё отдельные привелегии задавать...
    А как так сделать в PGSQL?

    Помогите пожайлуста.
     
  2. alecksey

    alecksey Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1
    Симпатии:
    0
    Попробуй так:
    SELECT (my_func()).*;
     
  3. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    функция которая возвращает набор записей

    [sql]
    CREATE OR REPLACE FUNCTION "public"."v_tree_func2" (integer) RETURNS SETOF "public"."v_tree_type" AS'
    declare
    my_parent alias for $1;
    my_rec record;
    s v_tree_type%ROWTYPE;
    begin
    for my_rec in select * from v_tree where parent=my_parent
    loop
    s.id := my_rec.id;
    s.parent := my_rec.parent;
    s.href := my_rec.href;
    Return Next s;
    end loop;
    return;
    end;
    'LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY DEFINER;
    [/sql]
     
  4. Veem

    Veem Активный пользователь

    С нами с:
    21 авг 2007
    Сообщения:
    76
    Симпатии:
    0
    Еще одним триггером не пробовали?
     
  5. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    не смеши