سؤال

يجب أن تتبع من التنقيحات من السجلات في الجدول.ما قمت به هو إنشاء الجدول الثاني يرث من الأول و يضيف مراجعة العداد.

CREATE TABLE A (
id SERIAL,
foo TEXT,
PRIMARY KEY (id));

CREATE TABLE B (
revision INTEGER NOT NULL) INHERITS (A);

ثم أنا خلقت الزناد أن تحديث الجدول باء في كل مرة يتم إدراج/تحديث.ما لا أستطيع فهمه هو كيفية جعل B. مراجعة إبقاء الفرد "تسلسل" لكل معرف.

على سبيل المثال:الجدول 2 الصفوف, i & j.
لقد تم تحديث 3 مرات و يجب أن يكون من 3 المراجعات:(1, 2, 3).
ي تم تحديث 2 مرات و ينبغي أن يكون اثنين من المراجعات:(1, 2).

هذا ما لدي حتى الآن, ربما أنا أسير في الطريق الخطأ و شخص يمكن أن تساعدني!

CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
    DECLARE
        last_revision INTEGER;
    BEGIN
        SELECT INTO last_revision MAX(revision) FROM B WHERE id = NEW.id;

        IF NOT FOUND THEN
            last_revision := 0;
        END IF;

        INSERT INTO B SELECT NEW.*;

        RETURN NEW;
    END;
$table_update$ LANGUAGE plpgsql;

CREATE TRIGGER table_update
AFTER INSERT OR UPDATE ON A
    FOR EACH ROW EXECUTE PROCEDURE table_update();
هل كانت مفيدة؟

المحلول

إذا كنت في حاجة إلى أرقام إصدار فقط ليأمر، ولا حاجة إليها على وجه التحديد أن يكون صحيحا أن زيادة بنسبة واحد لكل معرف، وأسهل طريقة للقيام بذلك هو استخدام تسلسل للمراجعة ومجرد السماح لها القيام تتبع بالنسبة لك:

CREATE TABLE A (
    id SERIAL,
    foo TEXT,
    PRIMARY KEY (id)
);

CREATE TABLE B ( revision SERIAL NOT NULL) INHERITS (A);

CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
    BEGIN
        INSERT INTO B SELECT NEW.*;
        RETURN NEW;
    END;
$table_update$ LANGUAGE plpgsql;

CREATE TRIGGER table_update
AFTER INSERT OR UPDATE ON A
    FOR EACH ROW EXECUTE PROCEDURE table_update();

وثم القيام إدراج كالعادة:

    try=# insert into a (foo) values ('bar');
    INSERT 0 1
    try=# insert into a (foo) values ('bar');
    INSERT 0 1
    try=# update a set foo = 'you' where id = 1;
    UPDATE 2
    try=# select * from b;
     id | foo | revision 
    ----+-----+----------
      2 | bar |        2
      1 | you |        1
      1 | you |        3
    (3 rows)

وهكذا يمكنك الحصول على كل المراجعات للصف معين مثل ذلك:

    try=# select * from b where id = 1 order by revision;
     id | foo | revision 
    ----+-----+----------
      1 | you |        1
      1 | you |        3
    (2 rows)

نصائح أخرى

وهنا اقتراحي:

CREATE OR REPLACE FUNCTION table_update() RETURNS TRIGGER AS $table_update$
DECLARE
    last_revision INTEGER;
BEGIN
    SELECT INTO last_revision coalesce(MAX(revision), 0) FROM B WHERE id = NEW.id;

    INSERT INTO B SELECT NEW.*, last_revision + 1;

    RETURN NEW;
END;
$table_update$ LANGUAGE plpgsql;

ولقد غيرت "إذا لم يتم العثور" إلى الاندماج، التي من شأنها أن اختيار "0" إذا لم يكن هناك مراجعة القائمة. ثم، وأنا أدخل في B على التوالي، مع مراجعة زيادة.

كن حذرا مع ميراثك: سوف تحتاج إلى استخدام "فقط" الكلمة للحد من نفسك الى طاولة وعند اختيار وتحديثها، على هذا النحو:

select * from only A
update only A set foo = ... where id = ...

هنا هي ميزة الغنية Aduit حزمة بوستجرس التي استخدمتها في الماضي: مراجعة الزناد.ويتابع نوع من التحديث (insert, update, delete) وكذلك قبل وبعد قيم التحديث.

--THIS TABLE AUTOMATICALLY INCREMENT THE COLUMN VALUES USING TRIGGER
CREATE TABLE emp_table(
  emp_id int not null,
  emp_name varchar not null,
  emp_rollno int not null,
  primary key(emp_id)
);

--Now create table with three column and emp_id is primary key
--and emp_rollno both are automatically increment in trigger is fired
CREATE or REPLACE FUNCTION emp_fun() RETURNS TRIGGER AS $BODY$
--creating function emp_fun()
DECLARE
BEGIN
  IF(tg_op='INSERT') THEN
    NEW.emp_id=COALESCE((SELECT MAX(emp_id)+1 FROM emp_table), 1);
    NEW.emp_rollno=COALESCE((SELECT MAX(emp_rollno)+1 FROM emp_table), 1);
    --trigger is fired values is automatically increment
END IF;

IF tg_op='DELETE' THEN RETURN OLD; ELSE RETURN NEW; END IF;
END; $BODY$LANGUAGE PLPGSQL

CREATE TRIGGER emp_fun BEFORE INSERT ON
  emp_table FOR EACH ROW EXECUTE PROCEDURE emp_fun();

INSERT INTO emp_table(emp_name) VALUES('BBB');
--insert the value tanle emp_table
SELECT * FROM emp_table
-- Check the result
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top