2013-02-09 30 views
5

Nếu tôi có trình kích hoạt trước khi cập nhật trên bảng CANINES đặt cột dấu thời gian thành hiện tại() và DOGS kế thừa từ CANINES, khi hàng DOGS được cập nhật, trình kích hoạt CANINES có được kích hoạt để kích hoạt không? Trong các thử nghiệm của tôi không, vì vậy tôi nghi ngờ câu trả lời là Không, nhưng có lẽ tôi đã không làm được những điều đúng:Thừa kế PostgreSQL: là trình kích hoạt bảng cha được kế thừa?

create table canines 
(
lastupdate timestamp with time zone default now() 
); 

CREATE OR REPLACE FUNCTION stamp_lastupdate_column() 
    RETURNS TRIGGER AS $$ 
    BEGIN 
     NEW.lastupdate = now(); 
     RETURN NEW; 
    END; 
    $$ language 'plpgsql'; 


CREATE TRIGGER TRG_CANINES_BU BEFORE UPDATE 
     on CANINES FOR EACH ROW EXECUTE PROCEDURE 
     stamp_lastupdate_column(); 


create table dogs 
(id int primary key, 
breed varchar(25) 
) inherits (CANINES); 

insert into dogs(id, breed) values(1, 'sheltie'); 

select * from dogs; 
--"2013-02-09 06:49:31.669-05" , 1 , sheltie 

update dogs set breed = 'Sheltie/Shetland Sheepdog' where id = 1; 

select * from dogs; 
--"2013-02-09 06:49:31.669-05" , 1 , Sheltie/Shetland Sheepdog 
+0

Đây là một trong số ít các khu vực mà bảng kế thừa ít rõ ràng hơn bạn mong muốn. Các trigger và các ràng buộc khóa ngoài đều có vấn đề với các bảng được phân đoạn; họ yêu cầu mã để "hiểu" cấu trúc phân vùng thực tế để làm việc. Bạn thực sự không thể viết chúng một cách tổng quát cho bảng cấp cao nhất và làm cho chúng tự động làm việc cho các bảng phụ. –

+0

@Craig Ringer: Có. Đã có phần "cẩn thận" về các giới hạn. Nó cần phải có một meta-caveat: phần caveats này là không đầy đủ :-) – Tim

Trả lời

7

câu chuyện dài ngắn - không, nó không được thừa kế. Có tùy chọn để CREATE TABLE - LIKE ... INCLUDING ..., nhưng nó cũng không tuyên truyền kích hoạt.

Các vấn đề liên quan