创建触发器以将行移动到存档表

时间:2011-08-19 03:57:54

标签: sql postgresql triggers web-crawler

我不熟悉PostgreSQL中的触发器,我不知道我想做的是触发器工作,但是我老师的建议。

我有以下链接表:

id | link | visited | filtered | broken | visiting

最后四个属性是布尔值,默认为false。目前我在UPDATE上将其设置为true,并且没有更多用途(行)。

新设计的想法是让链接表只有idlink属性,其他属性属于归档表(visitedLinksTable,brokenLinksTable,filteredLinksTable和visitingTable)。

触发器是否为此?他们说将其移动到另一个表(插入一些存档表并从链接表中删除)

3 个答案:

答案 0 :(得分:1)

这些方面的东西应该有效。详情将取决于您的具体架构等。

CREATE FUNCTION update_function() RETURNS TRIGGER AS $$
BEGIN
    IF NEW.visited IS TRUE
        OR NEW.filtered IS TRUE
        OR NEW.broken IS TRUE
        OR new.visiting IS TRUE THEN
        INSERT INTO archive_table (id,link,visited,filtered,broken,visiting)
            VALUES NEW.id,NEW.link,NEW.visited,
                   NEW.filtered,NEW.broken,NEW.visiting;
        DELETE FROM table WHERE id=NEW.id;
        RETURN NULL;
    END IF;
    RETURN NEW
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_trigger
    BEFORE UPDATE ON table
    FOR EACH ROW EXECUTE PROCEDURE
        update_function();

答案 1 :(得分:0)

触发器对此不起作用。大概你需要一些方法来确定删除链接时应该移动到哪个表(访问,破坏,过滤,访问),但是没有办法告诉触发链接应该去哪里。

您可以使用几个非触发器函数来封装这样的进程:

  • 链接进入链接表。
  • 将链接移至“访问”表格。
  • 根据尝试链接的结果,将其从“访问”移至“已访问”,“已损坏”或“已过滤”的表格。

您可以使用存储过程来处理每个转换,但我不知道您是否获得了超过手动INSERT ... SELECTDELETE语句的任何内容。

但是,如果你真的有触发器的东西(嘿,谁不喜欢触发器?)那么你可以使用原来的六列表,添加最后访问的时间戳,并定期做一些清理 - 起来:

delete from link_table
where last_accessed < some_time
  and (visited = 't' or filtered = 't' or broken = 't')

然后你可以使用DELETE触发器根据布尔列将链接移动到一个存档表。

答案 2 :(得分:0)

我想,你可以在最近的PostgreSQL上使用视图和查看触发器。一般来说,我认为最好将存储逻辑封装在数据逻辑中,并且视图是一种有用的方法。

另一种方法是通过函数来​​访问/从表中访问。这样,您可以在必要时更改存储逻辑的同时维护一致的API。这是我经常使用的方法,但与视图方法相比,它有一些不同的权衡:

  1. 视图/触发器方法与ORM更好地协作,而程序方法完全不需要ORM。
  2. 每种方法都会出现不同的维护问题。了解它们是管理它们的关键。