2016-06-17 46 views

回答

0

添加這就要求NOTIFY觸發,然後讓你的客戶listen到該通道。

Listen和Notify有一些巨大的注意事項,但他們確實在做你想做的事情。例如,對誰可以發送通知沒有安全權限檢查,因此不要依賴任何有效負載。

我的做法是:

  1. LISTEN(第一,以防止競爭條件)
  2. 讀取表。存儲最新的時間戳,序列號或其他遞增值
  3. 當您收到通知時,查詢表中所有後面的行。永遠重複。

您可以再次通過通知發送行數據,但任何人都可以發送您的應用程序行數據,如果他們可以連接到數據庫,這有點危險。

0

PostgreSQL沒有任何方法來啓動任何操作。所有活動必須由外部事件觸發。

您可以在表上添加一個plperlu觸發器,以便從插入的行的值中對輸出進行格式化,並將它們附加到給定的日誌文件中。

CREATE OR REPLACE FUNCTION tf_log_to_file() RETURNS trigger AS 
$BODY$ 
    use strict; 
    use Time::HiRes qw(time); 
    use POSIX qw(strftime); 

    my $t = time; 
    my $date = strftime "%Y%m%d %H:%M:%S", localtime $t; 
    $date .= sprintf ".%03d", ($t-int($t))*1000; 
    my $contents = $date . ' Inv.Add ' . $_TD->{new}{yourcolname}; 

    my $file = "/var/log/mylog.log"; 
    open(my $out, '>>', $file) or die "Unable to open or create file $file: $!"; 
    print $out decode_bytea($contents); 
    close($out); 

$BODY$ LANGUAGE plperlu VOLATILE SECURITY DEFINER; 

CREATE TRIGGER t_log_to_file AFTER INSERT ON yourtable 
    FOR EACH ROW EXECUTE PROCEDURE tf_log_to_file(); 
相關問題