2015-10-29 72 views
3

插入行由於某種原因,我只是無法弄清楚這一點。我在PostgreSQL中有一個獨立的模式,用於連接到服務器的每個用戶的通知相關表。我的計劃是讓每個用戶創建一個TEMP表來接收來自Xojo不支持PostgreSQL有效載荷的額外通知信息。
我覺得我開始接近,所以我只會發布我的觸發器函數中的代碼。循環遍歷所有用戶表,並在每個

DECLARE 
     my_table RECORD; 
    BEGIN  
     FOR my_table IN 
      SELECT table_name 
      FROM information_schema.tables 
      WHERE table_schema = 'information_schema' 
     LOOP 
      INSERT INTO my_table.table_name (effected_row_id) 
       VALUES (NEW.effected_row_id); 
     END LOOP; 
    END; 

告訴我,如果我錯了,但我相信我的主要問題是搞清楚如何使用從INSERT語句中的SELECT語句返回的表名。

編輯: 這是我目前的觸發功能

-- Function: notification.my_insert_trigger_function() 

-- DROP FUNCTION notification.my_insert_trigger_function(); 

CREATE OR REPLACE FUNCTION notification.my_insert_trigger_function() 
    RETURNS trigger AS 
$BODY$DECLARE 
    my_table RECORD; 
BEGIN  
    FOR my_table IN 
     SELECT table_name 
     FROM information_schema.tables 
     WHERE table_schema = 'notification' AND table_name <> 'notification_global' AND table_name <> 'switcher' 
    LOOP 
     EXECUTE(FORMAT($f$ 
     INSERT INTO %s (effected_row_username) 
      VALUES (%s); 
     $f$, 'notification.' || my_table.table_name, NEW.effected_row_username)); 
    END LOOP; 
RETURN new; 
END;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION notification.my_insert_trigger_function() 
    OWNER TO serveradmin; 
+0

您可以顯示此表的DDL嗎? – Hambone

+0

我很樂意。你能向我解釋怎麼做? –

+0

沒關係,我想出瞭如何獲得DDL。你想要哪張桌子?將在觸發器中使用此函數的表或此函數將生效的其中一個表? 我會將後者添加到我原來的帖子 –

回答

1

你需要在你的觸發功能使用dynamic commands。 funcion format()通常非常有幫助。

DECLARE 
    my_table RECORD; 
BEGIN  
    FOR my_table IN 
     SELECT table_name 
     FROM information_schema.tables 
     WHERE table_schema = 'information_schema' 
    LOOP 
     EXECUTE(FORMAT($f$ 
     INSERT INTO %s (effected_row_id) 
      VALUES (%s); 
     $f$, my_table.tablename, NEW.effected_row_id)); 
    END LOOP; 
END; 
+0

謝謝klin我非常接近使這項工作,但我仍然有一個問題。 我使用了你的觸發器功能,並做了一些改變,以適合我需要的東西。我的問題是,我不斷收到一個錯誤,說該列「serveradmin」不存在。它從變量'New.effected_row_username'中獲得「serveradmin」。我想要弄清楚的是將文本從'New.effected_row_username'傳遞到affected_row_username字段。我將在我原來的帖子中發佈修改後的代碼。 –

+1

現在函數嘗試插入'VALUES(serveradmin)',但它應該插入'VALUES('serveradmin')'。所以你必須添加撇號:'VALUES('%s')'。 – klin