簡體   English   中英

pl / sql中是否有BEFORE SELECT觸發器?

[英]Is there a BEFORE SELECT trigger in pl/sql?

您好我使用sqldeveloper連接到oracle數據庫。

我的senario是我的數據庫中有一個客戶表,其中包含一個名為start_date的日期字段,其中包含用戶注冊日期和一個名為is_member的“布爾”字段。 每個成員資格僅持續一年,因此如果SYSDATE > start_date + 1year年,則is_member為false。

我想在用戶調用select語句之前檢查用戶是否仍然是成員(如果沒有,則更改is_member )。 這可能嗎?

如果沒有人有任何想法如何保持is_member字段是最新的? 你可以做一個每天調用一次的觸發器來查看會員資格是否已經過期?

謝謝你的推薦! =]

不要使用表列來存儲依賴數據,使用視圖:

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視圖列將始終包含最新數據。

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

然后,您的代碼將只查詢視圖而不是查詢基表。

這是應用程序執行檢查而不是觸發器的作業。 Triiger不會激活SELECT。

至於保持該領域的最新狀態,有兩種可能性。 首先設立夜間工作,以滅活任何已經過期的會員。 或者將結構更改為存儲membershipenddate而不是isactive,並在應用程序檢查中使用它來查看該成員是否處於活動狀態。

您可以向表和架構添加策略並添加所需的代碼。

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;

您可以定義每天運行的作業並更新is_member字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM