下面介绍了我尝试将数据从文件加载到运行在Linux RedHat 7.2主机上的PostgreSQL 8.0数据库的过程。
现在,我的问题是调用了FOR EVERY ROW
触发器并且程序正在执行。
我想要它做的是,一旦我在文件名中给出并根据记录的内容决定是否进行{{1},它会检查我的表中的相应行。 }或DUMP BULK DATA
只有一次(在触发器上)。
请帮我解决这个问题...
我的DUMP WHOLE CSV FILE
如下:
logfile.tmp
我正在使用的COPY命令:
27/Apr/2013:17:03:42 +0530#192.168.1.3#16#0@#$http://localhost/images/
banner-left.jpg@#$10.1ff.ff.ff#-#Y#-
27/Apr/2013:17:03:42 +0530#192.168.1.3#16#0@#$http://localhost/images/
banner-left.jpg@#$10.ff.ff.2ff05#-#Y#-
有问题的触发器(/usr/local/pgsql/bin/psql localhost -d d1 -U u1 -tc "COPY tblaccesslog ( accesstime, clientip, username, request,bytes, urlpath, url, contenttype, issite, webcatname) FROM 'logfile.tmp' WITH DELIMITER AS '#';" >> /tmp/parselog.log 2>&1
):
insert_accesslog_trigger
最后使用了触发函数(insert_accesslog_trigger BEFORE INSERT ON tblaccesslog FOR EACH ROW EXECUTE PROCEDURE accesslog_insert_trigger()
):
accesslog_insert_trigger()
答案 0 :(得分:2)
PostgreSQL documentation overview of triggers表明没有适合您要求的触发器类型:正如其名称所示,FOR EACH ROW
触发器将针对每一行执行一次,并且作为手册页状态“语句级触发器目前无法检查由语句修改的各行。”
但是,您可以做的是将实际的COPY
命令放在函数中。该函数可以COPY TO
一个临时表,然后执行适当的步骤以确定它应该从哪里开始。
然后你的复制命令(我猜是在cron
工作或类似工作)只会运行SELECT bulk_insert_access_log();
而不是当前列出的长行。