0

わかりました..それで、変化の指標として日付を使用することになると、ちょっと頭がおかしくなる上司がいます。彼はそれを信用していません。

私がやりたいことは、アクティブなレコードにネイティブに付属する日付更新と同じように機能するものを作成することですが、代わりに、増加し続ける数値に基づいて..知っています... 1973 年以降の秒数は常に大きくなっています。夏時間などを考慮しない限り。

これを優雅に行う方法について何か考えがあるかどうか疑問に思っています..これを必要とする20のテーブルがあり、私はDRYの大ファンです。

4

2 に答える 2

0

データベース内で大量トリガーを使用することになりました。この関数は、data_changed という新しいテーブルにレコードを作成 (または更新) します。

def create_trigger_function(schema)
    puts "DAVE: creating trigger function for tenant|schema #{schema.to_s}"
    sql = "CREATE OR REPLACE FUNCTION \""+schema+"\".insert_into_delta_table() RETURNS TRIGGER AS 'BEGIN
            UPDATE \""+schema+"\".data_changes SET status = 1, created_at = now() where table_name = TG_TABLE_NAME and record_id = NEW.id;
            INSERT INTO \""+schema+"\".data_changes (status, table_name, market_id, record_id, created_at)
                                                 ( select m.* from \""+schema+"\".data_changes as ds right outer join
                                                    (select  1, CAST (TG_TABLE_NAME AS text ) as name , markets.id, NEW.id as record_id, now() from \""+schema+"\".markets) as m
                                                    on
                                                    ds.record_id = m.record_id
                                                    and ds.market_id = m.id
                                                    and table_name = name
                                                    where ds.id is null );                
            RETURN NULL;
            END;' LANGUAGE plpgsql;"    
    connection.execute(sql);
  end

変更されたすべての「製品」を見つけるために私がしなければならないことは、

update data_changes set status = 2 where status = 1 and table_name = 'products'
select * from products where id in (select record_id from data_changes where status = 2 and table_name = 'products')
update data_changes set status = 3 where status = 2 and table_name = 'products'

最初の更新を行った後、選択を行う前に
製品が更新された場合、ID が 1 にリセットされるため、選択に表示されません。選択を行った後に製品が更新された場合、しかし、最後の更新を行う前に、最後の更新の影響を受けません。

私の選択の内容は古くなりますが、それを回避する実際の方法はありません。

于 2012-04-26T01:07:17.330 に答える