2012-05-22 28 views
0

我需要編寫一個觸發器來檢查表列以查看數據是否存在。觸發器需要一直運行並每小時記錄一次msg。postgres觸發器檢查數據

基本上,它會運行一個select語句如果結果發現,然後睡一個小時否則日誌和睡眠一個小時

+0

你是在說一個預定的「工作」,然後在「睡眠」後重新運行(安排每小時運行一次的工作)......或者你是否在說每次插入/更新/刪除記錄時都會觸發的觸發器?我認爲如果每小時運行一次,你會考慮更多預定的工作。 – Twelfth

+0

你是什麼意思,「如果數據是否存在」? –

+0

在一個表中有一行帶有時間戳,我想檢查一行是否在最後一小時插入,如果是這樣,則等待其他日誌消息 – user373201

回答

1

在插入,更新或刪除事件之前或之後,可以執行觸發器(在pg中和我知道的每個dbms中)。您可能需要的是每小時通過類似cron(如果您使用的是unix系統)啓動的腳本,將您的輸出重定向到日誌文件。 我用這樣的事情很多次,這聽起來像這樣(用Python編寫的):

#!/usr/bin/python 


import psycopg2 
try: 
    conn = psycopg2.connect("dbname='"+dbmane+"' user='"+user+"' host='"+hostname+"' password='"+passwd+"'") 
except: 
    # Get the most recent exception 
    exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() 
    # Exit the script and print an error telling what happened. 
    logging.debug("I am unable to connect to the database!\n ->%s" % (exceptionValue)) 
    exit(2) 

cur = conn.cursor() 

query = "SELECT whatever FROM wherever WHERE yourconditions" 
try: 
    cur.execute(query) 
except ProgrammingError: 
    print "Programming error, no result produced" 
result = cur.fetchone() 

if(result == None): 
    #do whatever you need, if result == None the data is not in your table column 

我曾經通過cron來啓動我的腳本每隔10分鐘,你可以很容易地將其配置爲啓動腳本每隔一小時重定向它的輸出到您選擇的日誌文件。

如果你在一個Windows環境下工作,那麼你會找到類似cron的東西。 我不認爲觸發器可以幫助你做到這一點,它們只有在發生了一些事件後纔會觸發(如果插入的數據是每小時都要檢查的數據,則可以使用觸發器檢查每次插入後的事件,但這不是同樣,通過腳本來完成是我的經驗中最好的解決方案)

2

你想要的是一個預定作業。 pgAgent:http://www.pgadmin.org/docs/1.4/pgagent.html創建一個小時工作,檢查該行,然後根據需要進行日誌記錄。

編輯以添加: 好奇心如果您已經考慮編寫一個SQL腳本,通過閱讀表格而不是作業來即時生成日誌。如果您有時間戳字段,則很可能會有一個腳本返回在該時間範圍內沒有相應條目的所有小時期(假定時間戳未更新)。爲什麼要直接根據數據生成第二個日誌?