powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изменения значения поля перед вставкой
7 сообщений из 7, страница 1 из 1
Изменения значения поля перед вставкой
    #39796980
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Подскажите пожалуйста что я делаю не так, я пытаюсь изменить значение поля массива NEW перед insert
Код: sql
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.
-- TABLE
CREATE TABLE gdo.sdo_multiline_wgs
(
  mslink serial NOT NULL,
  label character varying(50),
  geometry_spa geometry(GeometryZ,4326), -- с высотной отметкой
  CONSTRAINT sdo_multiline_wgs_pkey PRIMARY KEY (mslink)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE gdo.sdo_multiline_wgs
  OWNER TO postgres;
-- TRIGGER
CREATE OR REPLACE FUNCTION gdo.func_sdo_multiline_wgs_iu()
  RETURNS trigger AS '
BEGIN
  NEW.geometry_spa := st_force3d(NEW.geometry_spa);       
  RETURN NEW;
END' LANGUAGE 'plpgsql';
ALTER FUNCTION gdo.func_sdo_multiline_wgs_iu()
  OWNER TO postgres;
GRANT EXECUTE ON FUNCTION gdo.func_sdo_multiline_wgs_iu() TO public;
GRANT EXECUTE ON FUNCTION gdo.func_sdo_multiline_wgs_iu() TO postgres;

CREATE TRIGGER sdo_multiline_wgs_iu
  BEFORE INSERT
  ON gdo.sdo_multiline_wgs
  FOR EACH ROW
  EXECUTE PROCEDURE gdo.func_sdo_multiline_wgs_iu(); 



Я вставляю сначала геометрию с высотной отметкой, ошибок не наблюдается
Код: sql
1.
2.
INSERT INTO gdo.sdo_multiline_wgs(label, geometry, geometry_spa)
VALUES ('', null, st_force3d(st_geomfromtext('LINESTRING Z(71.1400586429183 62.03894429373904 10, 71.14139647812075 62.03827537613782 0)', 4326)));



Потом я вставляю геометрию без высотных отметок. По идеи триггер должен её перевести в геометрию с высотной отметкой
Код: sql
1.
2.
3.
4.
5.
INSERT INTO gdo.sdo_multiline_wgs(label, geometry, geometry_spa)
VALUES ('', null, st_force2d(st_geomfromtext('LINESTRING(71.1400586429183 62.03894429373904, 71.14139647812075 62.03827537613782)', 4326)));

ОШИБКА: Column has Z dimension but geometry does not
SQL-состояние: 22023



Почему триггер не срабатывает. Он не может пропустить тип, который не соответствует типу поля таблицы, если да то как это обойти?
...
Рейтинг: 0 / 0
Изменения значения поля перед вставкой
    #39797032
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

потому что триггер вызывается после валидации типов данных.
Сделайте хранимку и пишите через неё.
...
Рейтинг: 0 / 0
Изменения значения поля перед вставкой
    #39797036
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MelkijNechto,

потому что триггер вызывается после валидации типов данных.
Сделайте хранимку и пишите через неё.

По валидации понял. Можете по подробнее рассказать про хранимку, как я её могу использовать в данном случае?
...
Рейтинг: 0 / 0
Изменения значения поля перед вставкой
    #39797054
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

имею в виду, что делаете хранимку которая принимает какие-то допустимые параметры, приводит их в нужные и выполняет insert. Вместо вызова insert самостоятельно соответственно вызываете хранимку.
...
Рейтинг: 0 / 0
Изменения значения поля перед вставкой
    #39797059
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijNechto,

потому что триггер вызывается после валидации типов данных.
Сделайте хранимку и пишите через неё.
вариант -- вьюха с плоскими данными + инстед оф триггер.
...
Рейтинг: 0 / 0
Изменения значения поля перед вставкой
    #39797154
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MelkijNechto,

имею в виду, что делаете хранимку которая принимает какие-то допустимые параметры, приводит их в нужные и выполняет insert. Вместо вызова insert самостоятельно соответственно вызываете хранимку.

Что такое хранимка я понимаю. Вопрос в другом что будет её приводить в действие? Ведь эта пространственная таблица будет использовать разными программами.

qwwq вариант -- вьюха с плоскими данными + инстед оф триггер.
У представления как обстоят дела с валидацией?
...
Рейтинг: 0 / 0
Изменения значения поля перед вставкой
    #39797236
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechtoqwwq вариант -- вьюха с плоскими данными + инстед оф триггер.
У представления как обстоят дела с валидацией?

? Ы

Ы:

Код: sql
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.
-- Table: public.test

 DROP TABLE if exists public.test cascade;

CREATE TABLE public.test
(
  id integer primary key ,
  finteger int
)
;

CREATE or replace FUNCTION public.ftr_ib_test() RETURNS trigger AS
$BODY$begin
	new.finteger = new.finteger::int;
	return new;
end;$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF;

CREATE TRIGGER tr_bi BEFORE INSERT
   ON public.test FOR EACH ROW
   EXECUTE PROCEDURE public.ftr_ib_test();
------------------
INSERT INTO public.test(
            id, finteger)
    VALUES (1,'1.');

------------
ОШИБКА:  неверное значение для целого числа: "1."
СТРОКА 3:     VALUES (1,'1.');



Код: sql
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.
create view test_vw as
SELECT id, finteger::text
  FROM public.test;

CREATE OR REPLACE FUNCTION public.ftr_ib_test_vw()
  RETURNS trigger AS
$BODY$begin
	INSERT INTO public.test(
			id, finteger)
		VALUES (New.id,new.finteger::numeric::int);
	return new;
end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

CREATE TRIGGER tr_bi
  INSTEAD OF INSERT
  ON public.test_vw
  FOR EACH ROW
  EXECUTE PROCEDURE public.ftr_ib_test_vw();

INSERT INTO public.test_vw(
            id, finteger)
    VALUES (1,'1.');

select * from test_vw;



...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Изменения значения поля перед вставкой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]