BG Development


Страници: (5) [1] 2 3 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Изтриване на ред след update, postgresql
thrawn
Публикувано на: 28-10-2018, 11:40
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1891
Регистриран на: 17.01.17



Задачката е да ъпдейтна поле в ред преди да го изтрия icon_confused.gif
Опитвам се да мина с една заявка, без да ползвам функции ама нещо получавам странно поведение и не мога да разбера защо.

Това е постановката
CODE
with tmp as (
   update users set by_user_id = '0004' where id = '0006' returning id
)
select users.id, tmp.id from users, tmp
where users.id = tmp.id;
 id   |  id
------+------
0006  | 0006
(1 row)


with tmp as (
   update users set by_user_id = '0004' where id = '0006' returning id
)
delete from users
using tmp
where users.id = tmp.id;
DELETE 0


ключовете съвпадат и всичко би трябвало да работи, но данните не се изтриват.


---
http://sqlfiddle.com/#!17/b677a/1

Това мнение е било редактирано от thrawn на 28-10-2018, 11:57
PMEmail Poster
Top
relax4o
Публикувано на: 28-10-2018, 14:51
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2151
Регистриран на: 04.04.07



Опасявам се, че това, което се опитваш, не е възможно.

QUOTE

Trying to update the same row twice in a single statement is not supported. Only one of the modifications takes place, but it is not easy (and sometimes not possible) to reliably predict which one. This also applies to deleting a row that was already updated in the same statement: only the update is performed.


https://www.postgresql.org/docs/9.6/static/queries-with.html - последния параграф.

Това мнение е било редактирано от relax4o на 28-10-2018, 14:53


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
relax4o
Публикувано на: 28-10-2018, 15:15
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2151
Регистриран на: 04.04.07



Поиграх си малко и това решение би свършило задачата, която се опитваш да постигнеш, но не знам до колко е правилно решението.


http://sqlfiddle.com/#!17/9ee58/1

П.П. Чисто от любопитство. Каква е идеята първо да ъпдейтнеш дадена колона и след това да изтриеш същия запис?

Това мнение е било редактирано от relax4o на 28-10-2018, 15:20


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
SuN
Публикувано на: 28-10-2018, 16:19
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 7188
Регистриран на: 27.01.05



QUOTE (relax4o @ 28-10-2018, 15:15)
П.П. Чисто от любопитство. Каква е идеята първо да ъпдейтнеш дадена колона и след това да изтриеш същия запис?

И аз си помислих същия въпрос, но не го зададох за да не ме помислят за начинаещ (за тия с нежните чувства - ламер). Подозирам, че това изискване в дадената постановка е излишно, но в реалния свят се случва нещо между обновяването и изтриването - някаква логика се задейства.

Това мнение е било редактирано от SuN на 28-10-2018, 16:19


--------------------
Копирай лесно ударено и - ѝ Ѝ
Замърсяване на въздуха в София - http://aqicn.org/city/bulgaria/sofia/druzhba/
PMEmail Poster
Top
relax4o
Публикувано на: 28-10-2018, 16:24
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2151
Регистриран на: 04.04.07



QUOTE (SuN @ 28-10-2018, 16:19)
QUOTE (relax4o @ 28-10-2018, 15:15)
П.П. Чисто от любопитство. Каква е идеята първо да ъпдейтнеш дадена колона и след това да изтриеш същия запис?

И аз си помислих същия въпрос, но не го зададох за да не ме помислят за начинаещ (за тия с нежните чувства - ламер). Подозирам, че това изискване в дадената постановка е излишно, но в реалния свят се случва нещо между обновяването и изтриването - някаква логика се задейства.

На мен ми е позволено да задавам ламерски въпроси, хаха.

Може би цялата задача ще се използва по различен начин, където не update-а и delete-а не боравят с един запис в една таблица, а в различни, при което примера на @thrawn ще е валиден изцяло, без да се налагат разни гимнастики.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
wqw
Публикувано на: 28-10-2018, 16:26
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 5880
Регистриран на: 10.06.04



Може би има delete тригери, в които логва данните от реда в audit лог. Сигурно прави PoC за промените по Наредба Н18. . .

cheers,
</wqw>

Това мнение е било редактирано от wqw на 30-10-2018, 09:13


--------------------
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 28-10-2018, 18:11
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1891
Регистриран на: 17.01.17



Точно за delete тригер става дума. И точно за тоя казус.

Обмислях дали да не изпляскам един флаг, че редът е изтрит ама той ще повлече излишни проверки след себеси. Затова ще трия с функция. Така постановката работи коректно.

Това мнение е било редактирано от thrawn на 28-10-2018, 18:16
PMEmail Poster
Top
dvader
Публикувано на: 30-10-2018, 03:47
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4160
Регистриран на: 12.07.05



Ама аудит лога не е ли в друга таблица, щото първоначалният въпрос го разбирам, че трябва да се модифицира реда, който трябва да се трие.
А акое в друга таблица, какво пречи да си ползва тригер?


--------------------
I find your lack of faith disturbing
PM
Top
thrawn
Публикувано на: 30-10-2018, 06:16
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1891
Регистриран на: 17.01.17



Това е "мръсен" начин да се подаде параметър на тригера.
В логовете трябва да се запише кой потребител (на приложението) е изтрил записът. Затова са налага неговото id да се подаде като параметър на тригера. Това е целта на ъпдейта - полето by_user_id трябва да съдържа актуалните данни преди редът да бъде изтрит

Това мнение е било редактирано от thrawn на 30-10-2018, 06:17
PMEmail Poster
Top
dvader
Публикувано на: 31-10-2018, 13:29
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4160
Регистриран на: 12.07.05



QUOTE (thrawn @ 30-10-2018, 06:16)
Това е "мръсен" начин да се подаде параметър на тригера.

Ми подавай го наобратно - прави INSERT в лог таблицата с UserID, OpCode, TargetTable и т.н. а тригера от нея ще прави самото триене.


--------------------
I find your lack of faith disturbing
PM
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (5) [1] 2 3 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0