Есть ли триггер ДО ВЫБОРА в pl / sql? - PullRequest
2 голосов
/ 17 февраля 2012

Привет! Я использую sqldeveloper, подключенный к базе данных Oracle.

Мой senario - у меня есть таблица клиентов в моей базе данных с полем даты под названием start_date, в котором содержится дата дня, когда пользователь зарегистрировался.и «логическое» поле с именем is_member.Каждое членство длится только один год, поэтому is_member равно false, если SYSDATE > start_date + 1year.

. Я хотел бы проверить, не является ли пользователь участником (и изменить is_member, если нет) допользователь вызывает оператор выбора.Возможно ли это?

Если у кого-то нет идей, как еще обновлять поле is_member?Можете ли вы сделать триггер, который вызывается один раз в день, чтобы проверить, не истек ли срок действия членства?

Спасибо заранее!=]

Ответы [ 5 ]

5 голосов
/ 17 февраля 2012

Не используйте столбец таблицы для хранения зависимых данных, используйте представление:

CREATE OR REPLACE VIEW customer_v AS
SELECT c.*, 
       CASE WHEN SYSDATE > add_months(c.start_date, 12) 
          THEN 'FALSE' 
          ELSE 'TRUE' 
       END is_member
  FROM customer c

Столбец представления is_member всегда будет содержать последние данные.

4 голосов
/ 17 февраля 2012

В PL / SQL не существует триггера BEFORE SELECT.

Звучит так, будто is_member вообще не должен быть столбцом в таблице, а должен вычисляться вПосмотреть.Что-то вроде

CREATE OR REPLACE VIEW view_name
AS
  SELECT <<list_of_columns>>
         (CASE WHEN sysdate > add_months(start_date, 12)
               THEN 'Y'
               ELSE 'N'
           END) is_member
    FROM your_table

Ваш код будет просто запрашивать представление, а не запрашивать базовую таблицу.

1 голос
/ 17 февраля 2012

Это работа для приложения, чтобы выполнить проверку, а не триггер. Triiger не стреляет по SELECT.

Что касается обновления поля, есть две возможности. Сначала создайте ночную работу, чтобы инактивировать любых участников, чьи членские обязанности истекли. Или измените свою структуру, чтобы хранить membershipenddate, а не isactive, и использовать это в проверке приложения, чтобы увидеть, активен ли участник.

0 голосов
/ 13 сентября 2012

Вы можете определить задание, которое выполняется каждый день, и обновить поле is_member.

0 голосов
/ 13 сентября 2012

Вы можете добавить политику в свою таблицу и схему и добавить нужный код.

http://docs.oracle.com/cd/B28359_01/network.111/b28531/vpd.htm#CIHCAACD

CREATE OR REPLACE FUNCTION auth_orders( 
schema_var IN VARCHAR2,
table_var  IN VARCHAR2)
RETURN VARCHAR2
IS
return_val VARCHAR2 (400);
BEGIN
return_val := 'SALES_REP_ID = 159';
RETURN return_val;
END auth_orders;


BEGIN
DBMS_RLS.ADD_POLICY (
object_schema    => 'oe',
object_name      => 'orders',
policy_name      => 'orders_policy',
function_schema  => 'sys',
policy_function  => 'auth_orders',
statement_types  => 'select, insert, update, delete'
);
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...