2010-06-10 278 views
1

這是一個多部分的問題。PostgreSQL的觸發器和傳遞參數

我有類似表:

CREATE TABLE sales_data (
    Company character(50), 
    Contract character(50), 
    top_revenue_sum integer, 
    top_revenue_sales integer, 
    last_sale timestamp) ; 

我想創造新的插入觸發到這個表中,這樣的事情:

CREATE OR REPLACE FUNCTION add_contract() 
RETURNS VOID 
DECLARE 
    myCompany character(50), 
    myContract character(50), 

BEGIN 
    myCompany = TG_ARGV[0]; 
    myContract = TG_ARGV[1]; 

    IF (TG_OP = 'INSERT') THEN 
     EXECUTE 'CREATE TABLE salesdata_' || $myCompany || '_' || $myContract || ' (
      sale_amount integer, 
      updated TIMESTAMP not null, 
      some_data varchar(32), 
      country varchar(2) 
     ) ;' 
     EXECUTE 'CREATE TRIGGER update_sales_data BEFORE INSERT OR DELETE ON salesdata_' 
      || $myCompany || '_' || $myContract || ' FOR EACH ROW EXECUTE update_sales_data(' 
      || $myCompany || ',' || $myContract || ', revenue);' ; 
    END IF; 
END; 
$add_contract$ LANGUAGE plpgsql; 

CREATE TRIGGER add_contract AFTER INSERT ON sales_data FOR EACH ROW EXECUTE add_contract() ; 

基本上,我每次插入時間一個新的行到sales_data,我想要生成一個新表,其中表的名稱將被定義爲像「salesdata_Company_Contract」

所以我的第一個問題是我怎麼能將公司和合同數據分配給觸發器,以便將其傳遞給add_contract()存儲過程?

從我的存儲過程,你會看到,我也想更新每當新的數據插入到表salesdata_Company_Contract原SALES_DATA表。此觸發會做這樣的事情:

CREATE OR REPLACE FUNCTION update_sales_data() RETURNS trigger as $update_sales_data$ 
DECLARE 
    myCompany character(50) NOT NULL, 
    myContract character(50) NOT NULL, 
    myRevenue integer NOT NULL 

BEGIN 
    myCompany = TG_ARGV[0] ; 
    myContract = TG_ARGV[1] ; 
    myRevenue = TG_ARGV[2] ; 

    IF (TG_OP = 'INSERT') THEN 
     UPDATE sales_data SET 
      top_revenue_sales = top_revenue_sales + 1, 
      top_revenue_sum = top_revenue_sum + $myRevenue, 
      updated = now() 
     WHERE 
      Company = $myCompany AND 
      Contract = $myContract ; 
    ELSIF (TG_OP = 'DELETE') THEN 
     UPDATE sales_data SET 
      top_revenue_sales = top_revenue_sales - 1, 
      top_revenue_sum = top_revenue_sum - $myRevenue, 
      updated = now() 
     WHERE 
      Company = $myCompany AND 
      Contract = $myContract ; 
    END IF; 
END; 
$update_sales_data$ LANGUAGE plpgsql; 

這當然會,要求我通過在這些存儲過程和觸發器各地的一些參數,我不知道(一)如果這甚至有可能,或者(b)實用,或者(c)最佳實踐,我們應該把這個邏輯放到我們的其他軟件中,而不是要求數據庫爲我們完成這項工作。

爲了讓我們的餐桌尺寸下降,因爲我們將有幾十萬,每天的交易,我們已經決定使他們都對自己使用分區的公司和我們的數據合同字符串作爲表名的一部分非常小;文件IO對我們來說更快,我們感覺我們會獲得更好的性能。

感謝您的任何想法或方向。

我的想法現在已經寫完了,可能我們需要編寫存儲過程,在這裏我們將插入數據作爲參數傳遞,並從其他軟件中調用該過程,並使存儲過程執行插入到「sales_data」然後創建另一個表。然後,有第二個存儲過程將新數據插入到salesdata_Company_Contract表中,其中表名作爲參數傳遞給存儲過程,並再次使存儲過程執行插入操作,然後更新主要sales_data表。

你會採取什麼方法?

+0

從我的第二種方法: 1.忘記觸發 2.寫稱爲「store_new_contract」存儲的過程,和通過公司名稱和合同名作爲參數,這將(a)中插入SALES_DATA表,(二)使用傳遞的參數創建補充表以生成字符串 3.編寫一個名爲'alter_contract_data'的存儲過程,其中包含多個參數,如動作字符串('insert'或'delete'),它將(a)插入/刪除從補充表中,(b)更新sales_data表並增加/減少最高銷售數字。 然後只需從SQL查詢調用存儲過程? – iandouglas 2010-06-10 23:02:38

回答

3

它看起來像你只需要引用新的或舊的參數輸入你的表。示例可以在優秀的Postgresql文檔here中找到。將您的價值引用爲NEW.Company和NEW.Contract。