我正在开发 Odoo,我们的数据库每天都在增长。我想为此做表分区,但我没有表分区过程的经验。首先,我尝试了新数据库。没关系,然后我为 Odoo 表分区处理了一些函数和触发器。我有错误。
以下是 account_move 和 account_move_line 表的插入函数和触发器。
------------- Create Partiton tables for 2020 ------------------
CREATE TABLE account_move_2020(
CHECK ( create_date >= DATE '2020-01-01' AND create_date < DATE '2020-12-31' )
) INHERITS (account_move);
CREATE INDEX account_move_2020_create_date ON account_move_2020 (create_date);
CREATE TABLE account_move_line_2020(
CHECK ( create_date >= DATE '2020-01-01' AND create_date < DATE '2020-12-31' )
) INHERITS (account_move_line);
CREATE INDEX account_move_line_2020_create_date ON account_move_line_2020 (create_date);
--------- Insert Function for Account Move -----------------------------
CREATE OR REPLACE FUNCTION account_move_insert_function()
RETURNS TRIGGER AS $$
BEGIN
EXECUTE format('INSERT INTO account_move_2020 (id, is_bank_reconcilation, date, name, ref, journal_id, company_id, state, period_id, narration, received_by, rev_rate, is_wallet_tran, partner_id, to_check, create_uid, write_uid, create_date, write_date) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19)') using NEW.id, NEW.is_bank_reconcilation, NEW.date, NEW.name, NEW.ref, NEW.journal_id, NEW.company_id, NEW.state, NEW.period_id, NEW.narration, NEW.received_by, NEW.rev_rate, NEW.is_wallet_tran, NEW.partner_id, NEW.to_check, NEW.create_uid, NEW.write_uid, NEW.create_date, NEW.write_date;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
------- Trigger for Account Move Insert ------------------------------
CREATE TRIGGER insert_account_move
BEFORE INSERT ON account_move
FOR EACH ROW EXECUTE PROCEDURE account_move_insert_function();
--------- Insert Function for Account Move Line-----------------------
CREATE OR REPLACE FUNCTION account_move_line_insert()
RETURNS TRIGGER AS $BODY$
BEGIN
EXECUTE format('INSERT INTO account_move_line_2020 (id, create_date, statement_id, journal_id, currency_id,date_maturity, partner_id, reconcile_partial_id, blocked, analytic_account_id, create_uid, credit, centralisation, company_id, reconcile_ref, tax_code_id, state, debit, ref, account_id, period_id, write_date, date_created, date, write_uid, move_id, reconcile_id, tax_amount, product_id, account_tax_id, product_uom_id, amount_currency, quantity, bank_reconciled, to_reconcile, bank_stmt_reconcile_id, invoice_id, cpe_id, service_id, line_employee_id, payment_invoice_id, project, name, asset_id) VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44)') using NEW.id, NEW.create_date, NEW.statement_id, NEW.journal_id, NEW.currency_id, NEW.date_maturity, NEW.partner_id, NEW.reconcile_partial_id, NEW.blocked, NEW.analytic_account_id, NEW.create_uid, NEW.credit, NEW.centralisation, NEW.company_id, NEW.reconcile_ref, NEW.tax_code_id, NEW.state, NEW.debit, NEW.ref, NEW.account_id, NEW.period_id, NEW.write_date, NEW.date_created, NEW.date, NEW.write_uid, NEW.move_id, NEW.reconcile_id, NEW.tax_amount, NEW.product_id, NEW.account_tax_id, NEW.product_uom_id, NEW.amount_currency, NEW.quantity, NEW.bank_reconciled, NEW.to_reconcile, NEW.bank_stmt_reconcile_id, NEW.invoice_id, NEW.cpe_id, NEW.service_id, NEW.line_employee_id, NEW.payment_invoice_id, NEW.project, NEW.name, NEW.asset_id;
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql;
------- Trigger for Account Move Line Insert ------------------
CREATE TRIGGER account_move_line_insert_trigger
BEFORE INSERT ON account_move_line
FOR EACH ROW EXECUTE PROCEDURE account_move_line_insert();
运行这些查询后,我从 UI 创建了新的发票。当我验证发票时,我收到了这样的错误。
发生该错误是因为当我在插入函数中使用RETURN NEW时,插入数据不仅在分区表上,而且在主表上。所以我添加了新的功能和触发器来删除这样的主数据。
-- Trigger function to delete from the master table after the insert
CREATE OR REPLACE FUNCTION account_move_delete_master()
RETURNS trigger AS $$
BEGIN
DELETE FROM ONLY account_move where id = new.id;
RETURN NULL;
end;
$$
LANGUAGE plpgsql;
-- Create the after insert trigger
CREATE TRIGGER after_insert_account_move_trigger
AFTER INSERT ON account_move
FOR EACH ROW EXECUTE PROCEDURE account_move_delete_master();
-- Trigger function to delete from the master table after the insert
CREATE OR REPLACE FUNCTION account_move_line_delete_master()
RETURNS trigger AS $$
BEGIN
DELETE FROM ONLY account_move_line where id = new.id;
RETURN NULL;
end;
$$
LANGUAGE plpgsql;
-- Create the after insert trigger
CREATE TRIGGER after_insert_account_move_line_trigger
AFTER INSERT ON account_move_line
FOR EACH ROW EXECUTE PROCEDURE account_move_line_delete_master();
在我运行这些查询并从 UI 再次验证之后。但是我遇到了另一个这样的错误。
我发现记录在主表和分区表中具有相同的 id数据。
例如,当我添加新记录时,它在分区表中插入索引id:11 。现在主表中发生的事情包括 2 条id:11的记录。
当我尝试删除带有 id 的主数据时,它也可能从分区数据中删除。
因此,如果您对此有任何想法,请与我分享。提前致谢。