LINUX.ORG.RU

Postgresql и триггеры


0

0

Помогите разобраться плз.
Есть три таблички:

CREATE TABLE price_zone (
    id_tariff int NOT NULL,
    id_zones int NOT NULL,
    price_per_mb_in numeric(9,4) DEFAULT 0 NOT NULL,
    price_per_mb_out numeric(9,4) DEFAULT 0 NOT NULL,

);

CREATE TABLE tariffs (
    id serial NOT NULL,
    name varchar(50) DEFAULT 'Новый тариф' NOT NULL,
    fee numeric(9,4) DEFAULT 0 NOT NULL,

    CONSTRAINT pk_tariff PRIMARY KEY (id)
);

CREATE TABLE zones (
    id serial NOT NULL,
    name VARCHAR(20) NOT NULL,
    descr VARCHAR(50),
    ordernum smallint NOT NULL,

    CONSTRAINT pk_zones PRIMARY KEY (id)
);

Подскажите как сделать, чтоб при создании тарифа в таблице tariffs, создавались бы записи в таблице price_zones по всем зонам из таблицы zones. Аналогично и для таблицы zones только для всех тарифов из таблицы tariffs.
Т.е. если создаём зону, то сразу создаются нулевые цены для всех тарифов в таблице price_zones для этой зоны и наоборот при создании тарифа.
anonymous

CREATE TABLE networks
(
  id serial NOT NULL,
  netmask varchar(255),
  description text,
  CONSTRAINT networks_pkey PRIMARY KEY (id)
)

CREATE OR REPLACE FUNCTION valid_cidr()
  RETURNS "trigger" AS
$BODY$
    DECLARE
		tmp cidr;
    BEGIN
        tmp := NEW.netmask;
        RETURN NEW;
    END;
	$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tr_valid_cidr
  BEFORE INSERT OR UPDATE
  ON networks
  FOR EACH ROW
  EXECUTE PROCEDURE valid_cidr();

тупой метод проверки валидности сети (релсы cidr из постгреса не монимают)

Pi ★★★★★
()
Ответ на: комментарий от Pi

Сделал вот так но постгрес не хочет принимать ткните носом где ошибки плз:

CREATE FUNCTION newtariff() RETURNS "trigger" AS ' declare zone integer; begin for zone in select id from zones loop insert into price_zones (id_zones,id_tariff,price_per_mb_in,price_per_mb_out) values (zone,new.id,0,0); end loop; return null; end; ' LANGUAGE plpgsql IMMUTABLE;

CREATE FUNCTION newzone() RETURNS "trigger" AS ' declare tariff integer; begin for tariff in select id from tariff loop insert into price_zones (id_zones,tariff,price_per_mb_in,price_per_mb_out) values (new.id,tariff,0,0); end loop; return null; end; ' LANGUAGE plpgsql IMMUTABLE;

CREATE TRIGGER new_price_on_new_tariff AFTER INSERT ON tariff FOR EACH ROW EXECUTE PROCEDURE newtariff();

CREATE TRIGGER new_price_on_new_zone AFTER INSERT ON zones FOR EACH ROW EXECUTE PROCEDURE newzone();

anonymous
()
Ответ на: комментарий от Pi

Сделал вот так но постгрес не хочет принимать ткните носом где ошибки плз:

CREATE FUNCTION newtariff() RETURNS "trigger"
    AS '
    declare
    zone integer;
begin
  for zone in select id from zones loop
  insert into price_zones (id_zones,id_tariff,price_per_mb_in,price_per_mb_out) values (zone,new.id,0,0);
  end loop;
  return null;
end;
'
    LANGUAGE plpgsql IMMUTABLE;

CREATE FUNCTION newzone() RETURNS "trigger"
    AS '
    declare
    tariff integer;
begin
  for tariff in select id from tariff loop
  insert into price_zones (id_zones,tariff,price_per_mb_in,price_per_mb_out) values (new.id,tariff,0,0);
  end loop;
  return null;
end;
'
    LANGUAGE plpgsql IMMUTABLE;

CREATE TRIGGER new_price_on_new_tariff
    AFTER INSERT ON tariff
    FOR EACH ROW
    EXECUTE PROCEDURE newtariff();

CREATE TRIGGER new_price_on_new_zone
    AFTER INSERT ON zones
    FOR EACH ROW
    EXECUTE PROCEDURE newzone();

anonymous
()
Ответ на: комментарий от Pi

Всё разобрался :) Вот как надо:

CREATE FUNCTION newtariff() RETURNS "trigger" AS ' declare z zones; begin for z in select * from zones loop insert into price_zones (id_zones,id_tariff,price_per_mb_in,price_per_mb_out) values (z.id,new.id,0,0); end loop; return null; end; ' LANGUAGE plpgsql VOLATILE;

CREATE FUNCTION newzone() RETURNS "trigger" AS ' declare t tariff; begin for t in select * from tariff loop insert into price_zones (id_zones,id_tariff,price_per_mb_in,price_per_mb_out) values (new.id,t.id,0,0); end loop; return null; end; ' LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER new_price_on_new_tariff AFTER INSERT ON tariff FOR EACH ROW EXECUTE PROCEDURE newtariff();

CREATE TRIGGER new_price_on_new_zone AFTER INSERT ON zones FOR EACH ROW EXECUTE PROCEDURE newzone();

anonymous
()
Ответ на: комментарий от anonymous

Тьфу форматирование забыл изменить опять... пол второго ночи...
Всё разобрался :) Вот как надо:

CREATE FUNCTION newtariff() RETURNS "trigger"
    AS '
    declare
    z zones;
begin
  for z in select * from zones loop
  insert into price_zones (id_zones,id_tariff,price_per_mb_in,price_per_mb_out) values (z.id,new.id,0,0);
  end loop;
  return null;
end;
'
    LANGUAGE plpgsql VOLATILE;

CREATE FUNCTION newzone() RETURNS "trigger"
    AS '
    declare
    t tariff;
begin
  for t in select * from tariff loop
  insert into price_zones (id_zones,id_tariff,price_per_mb_in,price_per_mb_out) values (new.id,t.id,0,0);
  end loop;
  return null;
end;
'
    LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER new_price_on_new_tariff
    AFTER INSERT ON tariff
    FOR EACH ROW
    EXECUTE PROCEDURE newtariff();

CREATE TRIGGER new_price_on_new_zone
    AFTER INSERT ON zones
    FOR EACH ROW
    EXECUTE PROCEDURE newzone();

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.