2017-10-09 82 views
0

我想創建事件觸發器創建表或選擇進入, 如: 時用「臨時」如何創建事件觸發器創建表或選擇到

我的代碼

bigen表XXXX必須的表名
CREATE OR REPLACE FUNCTION create_table_func() 
    RETURNS event_trigger 
    AS 
    $$ 
    DECLARE 
      V_TABLE name := TG_TABLE_NAME; 

BEGIN 

    if V_TABLE !~ '^temp' 

    then 

     RAISE EXCEPTION 'must bigen with temp'; 

    end if; 

END; 
$$ LANGUAGE plpgsql SECURITY DEFINER; 

CREATE EVENT TRIGGER create_table_1 ON ddl_command_start 

WHEN TAG IN ('SELECT INTO') 

EXECUTE PROCEDURE create_table_func(); 

但是當執行 SELECT *成從test_bak TEST11

[ERR] ERROR:列 「tg_table_name」 不存在

回答

1

特殊變量TG_TABLE_NAME僅在正常觸發器中受支持,而不是在事件觸發器中(並不總是關聯的表!)。

該文檔有一個list of functions,它可以在事件觸發器中返回上下文信息。

您可以使用pg_event_trigger_ddl_commands()來獲取所需的信息,但只適用於ddl_command_end事件觸發器。這應該適合你;我沒有看到爲什麼觸發器不應該在聲明結尾處運行的原因。

0

這是我的代碼,它是滿足我的需求

代碼:

CREATE OR REPLACE FUNCTION trg_create_table_func() 
RETURNS event_trigger 
LANGUAGE plpgsql 
AS $$ 
DECLARE 
    obj record;  
BEGIN 
    FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag in ('SELECT INTO','CREATE TABLE','CREATE TABLE AS') 
    LOOP 
     if obj.object_identity !~ 'public.temp_' 
     THEN 
     raise EXCEPTION 'The table name must begin with temp_'; 
     end if; 
     END LOOP; 
END; 
$$; 

CREATE EVENT TRIGGER trg_create_table ON ddl_command_end 
WHEN TAG IN ('SELECT INTO','CREATE TABLE','CREATE TABLE AS') 
EXECUTE PROCEDURE trg_create_table_func(); 

出recods

[錯誤]錯誤:表名稱必須以temp_ 上下文中開始:PL/pgSQL的函數trg_create_table_func()第10行在RAISE

很酷〜