【发布时间】:2013-04-27 12:12:40
【问题描述】:
下面是我尝试将数据从文件加载到在 Linux RedHat 7.2 主机上运行的 PostgreSQL 8.0 数据库中所经历的过程的描述。
现在,我的问题是 FOR EVERY ROW 触发器被调用并且过程正在执行。
但是,我希望它在我输入文件名后检查表的相应行,并根据记录的内容决定是执行DUMP BULK DATA 还是 @ 987654323@ 仅一次(在触发器上)。
请帮我解决这个问题...
我的logfile.tmp如下:
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#-
我正在使用的 COPY 命令:
/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()):
accesslog_insert_trigger()
DECLARE
tablemaxtuples NUMERIC(10);
tableno NUMERIC(10);
newtable TEXT;
query TEXT;
tablecount NUMERIC(10);
min_limit NUMERIC(10);
max_limit NUMERIC(10);
BEGIN
tablemaxtuples := 100000;
tableno := ( NEW.id - ( NEW.id % tablemaxtuples ) ) / tablemaxtuples +1;
newtable := 'tblaccesslog'||to_char(CURRENT_DATE,'YYYYMMDD')||'_child_'||tableno;
SELECT trim(count(tablename)) INTO tablecount FROM pg_tables WHERE tablename=newtable ;
IF tablecount = 0
THEN
min_limit := (tableno-1)*tablemaxtuples;
max_limit := min_limit + tablemaxtuples;
query := 'CREATE TABLE '||newtable||'( PRIMARY KEY (id),CHECK ( id >= '||min_limit||' AND id <'||max_limit||' ) ) INHERITS (tblaccesslog)';
EXECUTE query;
END IF;
query := 'INSERT INTO '|| newtable ||' ( id, username, clientip, url, accesstime, requestbytes, contenttype, issite, urlpath, webcatname ) VALUES ('||NEW.id||','''||NEW.username||''','''||NEW.clientip||''','''||NEW.url||''','''||NEW.accesstime||''','''||NEW.requestbytes||''','''||NEW.contenttype||''','''||NEW.issite||''','''|| replace(NEW.urlpath,'\'','') ||''','''||NEW.webcatname||''')';
EXECUTE query;
RETURN NULL;
END;
【问题讨论】:
-
8.0 已经很老了,可能存在未修补的安全问题。请尽快升级。
-
Red Hat 7.2 更早(2001 年),可能存在更多安全问题。您应该尽快将此数据迁移到现代服务器。
-
我无法升级它们中的任何一个..由于某些原因..你能帮我只做这个配置吗?
标签: postgresql plpgsql bulkinsert database-partitioning psql