postgres触发检查数据

时间:2012-05-22 18:33:44

标签: postgresql

我需要编写一个触发器来检查表列以查看数据是否存在。触发器需要一直运行并每小时记录一次消息。

基本上,如果找到结果,它会运行一个select语句,然后睡一小时的其他日志并睡一小时

2 个答案:

答案 0 :(得分:2)

你想要的是预定的工作。 pgAgent:http://www.pgadmin.org/docs/1.4/pgagent.html创建一个每小时的工作,检查该行,然后根据需要进行记录。

编辑添加: 如果您考虑编写一个通过读取表而不是作业来动态生成日志的SQL脚本,那就太好了。如果您有一个时间戳字段,则很可能有一个脚本返回在该时间范围内没有相应条目的所有每小时时段(假设时间戳未更新)。为什么在可以直接针对数据生成第二个日志时存储第二个日志?

答案 1 :(得分: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

我曾经每10分钟通过cron启动我的脚本,您可以轻松配置它以每小时启动脚本,将其输出重定向到您选择的日志文件。

如果您在Windows环境中工作,那么您将寻找像cron这样的东西。 我不认为触发器可以帮助你,它们只在一些事件后触发(如果插入的数据是你想要每小时检查一次,你可以使用触发器在每次插入后检查,但它不一样,通过脚本来做这是我经验中的最佳解决方案)