1 (edited by adiziktdy 2022-12-15 07:20:28)

Topic: [РЕШЕНО]Триггер не срабатывает по значению поля NULL

Если поле просто меняется (корректируется), по всё ОК. Если поле было пустое и заполняется значением, то нет sad

CREATE DEFINER=`********`@`%` TRIGGER `pk_adi`.`edit_anketa_napravl_spec` AFTER UPDATE ON pk_adi.anketa FOR EACH ROW

BEGIN
  Set @var_napravl_spec1 = Old.napravl_spec;
  IF Old.napravl_spec IS NULL then Set @var_napravl_spec1 = 'пусто'; End If;

  Set @var_napravl_spec2 = New.napravl_spec;
  IF New.napravl_spec IS NULL then Set @var_napravl_spec2 = 'пусто'; End If;  

  Set @fi= (SELECT CONCAT(fullname," ",name) FROM anketa WHERE id=Old.id);
  set @idU = New.id_users1;
  set @nKart = New.n_abit;
  SET @d_oper = (select Date_Format(now(),'%Y-%m-%d %H:%i:%S') FROM dual);

    IF New.napravl_spec != Old.napravl_spec then
  INSERT INTO log_extend VALUES(NULL,@idU,@d_oper,CONCAT("изменение поля <<специальность документа об образовании>> в № карточки ",@nKart," ",@fi,". Было: ",@var_napravl_spec1,", стало: ",@var_napravl_spec2));
  End if;

END;

Не могу найти причину..

Yana

Re: [РЕШЕНО]Триггер не срабатывает по значению поля NULL

Hello, I'm not sure to what field are you trying to cite here. The name perhaps? try using COALESCE while doing CONCAT with nullable fields

CONCAT(COALESCE(fullname,"")," ",COALESCE(name,""))
brian

3 (edited by adiziktdy 2022-12-15 07:22:38)

Re: [РЕШЕНО]Триггер не срабатывает по значению поля NULL

Решение состоит в том, чтобы описать все случаи при сравнении Old и New значений

CREATE DEFINER=`******`@`%` TRIGGER `pk_adi`.`edit_anketa_napravl_spec` AFTER UPDATE ON pk_adi.anketa FOR EACH ROW
BEGIN
  Set @var_napravl_spec1 = Old.napravl_spec;
  IF @var_napravl_spec1 IS NULL then Set @var_napravl_spec1 = 'пусто'; End If;
  Set @var_napravl_spec2 = New.napravl_spec;
  IF @var_napravl_spec2 IS NULL then Set @var_napravl_spec2 = 'пусто'; End If;
  Set @fi= (SELECT CONCAT(fullname," ",name) FROM anketa WHERE id=Old.id);
  set @idU = New.id_users1;
  set @nKart = Old.n_abit;

  IF (old.napravl_spec != new.napravl_spec) then   //когда поле изменяет свое значение, например, 11 на 22
  INSERT INTO log_extend VALUES(NULL,@idU,SYSDATE(),CONCAT("изменение поля <<специальность документа об образовании>> в № карточки ",@nKart," ",@fi,". Было: ",@var_napravl_spec1,", стало: ",@var_napravl_spec2));
  End if;

  IF ((old.napravl_spec is null ) AND (new.napravl_spec is not null)) then  //когда поле было пустым и принимает значение 11
  INSERT INTO log_extend VALUES(NULL,@idU,SYSDATE(),CONCAT("изменение поля <<специальность документа об образовании>> в № карточки ",@nKart," ",@fi,". Было: ",@var_napravl_spec1,", стало: ",@var_napravl_spec2));
  End if;

  IF ((new.napravl_spec is null) AND (old.napravl_spec is not null)) then //когда у поля было значение 22 и стало пустым
  INSERT INTO log_extend VALUES(NULL,@idU,SYSDATE(),CONCAT("изменение поля <<специальность документа об образовании>> в № карточки ",@nKart," ",@fi,". Было: ",@var_napravl_spec1,", стало: ",@var_napravl_spec2));
  End if;
END;

Можно, конечно, объединить  все условия в одну строку, но я оставила для наглядности.
На скрине результат отработки скрипта во всех случаях

https://b.radikal.host/2022/12/15/Image1512-1.jpg

Yana

Re: [РЕШЕНО]Триггер не срабатывает по значению поля NULL

Nice. It seems you got the solution then.
You can also try the condition <=>
Sorry, I don't speak Russian so I have to use G.Translate first.

CREATE DEFINER=`******`@`%` TRIGGER `pk_adi`.`edit_anketa_napravl_spec` AFTER UPDATE ON pk_adi.anketa FOR EACH ROW
BEGIN
  Set @var_napravl_spec1 = Old.napravl_spec;
  IF @var_napravl_spec1 IS NULL then Set @var_napravl_spec1 = 'пусто'; End If;
  Set @var_napravl_spec2 = New.napravl_spec;
  IF @var_napravl_spec2 IS NULL then Set @var_napravl_spec2 = 'пусто'; End If;
  Set @fi= (SELECT CONCAT(fullname," ",name) FROM anketa WHERE id=Old.id);
  set @idU = New.id_users1;
  set @nKart = Old.n_abit;

  IF !(old.napravl_spec <=> new.napravl_spec) THEN
  INSERT INTO log_extend VALUES(NULL,@idU,SYSDATE(),CONCAT("изменение поля <<специальность документа об образовании>> в № карточки ",@nKart," ",@fi,". Было: ",@var_napravl_spec1,", стало: ",@var_napravl_spec2));
  End if;
END;
brian

Re: [РЕШЕНО]Триггер не срабатывает по значению поля NULL

brian.zaballa wrote:

Nice. It seems you got the solution then.
You can also try the condition <=>
Sorry, I don't speak Russian so I have to use G.Translate first.

Thank you very much. I also use Yandex Translator because I speak a little English. Tomorrow I will try your version and report the results.

Yana

6 (edited by adiziktdy 2022-12-16 06:54:06)

Re: [РЕШЕНО]Триггер не срабатывает по значению поля NULL

to brian.zaballa

That's great! It's works, with a slight correction in the trigger condition:

CREATE DEFINER=`********`@`%` TRIGGER `pk_adi`.`edit_anketa_napravl_spec` AFTER UPDATE ON pk_adi.anketa FOR EACH ROW
BEGIN
  Set @var_napravl_spec1 = Old.napravl_spec;
  IF @var_napravl_spec1 IS NULL then Set @var_napravl_spec1 = 'пусто'; End If;
  Set @var_napravl_spec2 = New.napravl_spec;
  IF @var_napravl_spec2 IS NULL then Set @var_napravl_spec2 = 'пусто'; End If;
  Set @fi= (SELECT CONCAT(fullname," ",name) FROM anketa WHERE id=Old.id);
  set @idU = New.id_users1;
  set @nKart = Old.n_abit;

  IF (new.napravl_spec <=> old.napravl_spec)=0 then
  INSERT INTO log_extend VALUES(NULL,@idU,SYSDATE(),CONCAT("изменение поля <<специальность документа об образовании>> в № карточки ",@nKart," ",@fi,". Было: ",@var_napravl_spec1,", стало: ",@var_napravl_spec2));
  End if;

  END;

Results:

  • 16.12.2022 09:35:23    изменение поля <<специальность документа об образовании>> в № карточки 66666666 Полякова Елена. Было: TEST2, стало: TEST1

  • 16.12.2022 09:35:55    изменение поля <<специальность документа об образовании>> в № карточки 66666666 Полякова Елена. Было: TEST1, стало: пусто

  • 16.12.2022 09:36:46    изменение поля <<специальность документа об образовании>> в № карточки 66666666 Полякова Елена. Было: пусто, стало: TEST3



Thanks a lot! cool

Yana