Mysql, вставка в триггер вставки значений NULL, в то время как не должно - PullRequest
0 голосов
/ 20 июня 2019

Логика состоит в том, чтобы добавить строку в таблицу в другой БД, когда строка вставлена ​​в пользовательскую таблицу Keycloak (я думаю, достаточно просто) Случилось только то, что ключ имеет значение, но остальные были вставлены в NULL (у них есть значения, все они были правильно вставлены в таблицу KeyCloak до того, как произошел триггер)

У Цезаря была та же проблема, но она не работала с его решением. Триггер MySQL «После вставки» продолжает вставлять нули

Я использую PHPMyAdmin для Mysql некоторый код будет добавлен автоматически, например "для каждой строки ..."

Имя: добавить
Таблица: USER_ENTITY
Время: ПОСЛЕ
Событие: ВСТАВИТЬ
Определение:

BEGIN

INSERT INTO AnotherDB.application_user 
(`user_id`,`first_name`,`last_name`,`hash`) VALUES (NEW.ID, NEW.FIRST_NAME, 
NEW.LAST_NAME, md5(NEW.ID));

END

Я ожидаю, что вставленная строка будет ID, FIRST, LAST, HASH Но я получаю ID, NULL, NULL, HASH Так в чем же причина этой проблемы?

Изменить 21 июня: спасибо за правки и предложения. Sql создания целевой таблицы вставки

CREATE TABLE `application_user` (. 
    `user_id` varchar(256) NOT NULL,  
    `type` varchar(256) DEFAULT NULL,  
    `first_name` varchar(256) CHARACTER SET utf8 DEFAULT NULL,  
    `last_name` varchar(256) CHARACTER SET utf8 DEFAULT NULL,  
    `group_id` varchar(256) DEFAULT NULL,  
    `wallet_id` varchar(256) NOT NULL,  
     PRIMARY KEY (`user_id`). 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1. 

Таблица USER_ENTITY Keycloak намного длиннее, но, возможно, именно в этом проблема:

CREATE TABLE `USER_ENTITY` (
  `ID` varchar(36) COLLATE utf8_unicode_ci NOT NULL,
  `EMAIL` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `EMAIL_CONSTRAINT` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `EMAIL_VERIFIED` bit(1) NOT NULL DEFAULT b'0',
  `ENABLED` bit(1) NOT NULL DEFAULT b'0',
  `FEDERATION_LINK` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `FIRST_NAME` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `LAST_NAME` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `REALM_ID` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `USERNAME` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `CREATED_TIMESTAMP` bigint(20) DEFAULT NULL,
  `SERVICE_ACCOUNT_CLIENT_LINK` varchar(36) COLLATE utf8_unicode_ci DEFAULT NULL,
  `NOT_BEFORE` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  UNIQUE KEY `UK_DYKN684SL8UP1CRFEI6ECKHD7` (`REALM_ID`,`EMAIL_CONSTRAINT`),
  UNIQUE KEY `UK_RU8TT6T700S9V50BU18WS5HA6` (`REALM_ID`,`USERNAME`),
  KEY `IDX_USER_EMAIL` (`EMAIL`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

А также я создал эту тестовую таблицу в новой БД и поместил в один и тот же триггер, он отлично работает с обеими таблицами:

CREATE TABLE `test` (
  `ID` varchar(256) NOT NULL,
  `FIRST_NAME` varchar(256) NOT NULL,
  `LAST_NAME` varchar(256) NOT NULL,
  `SOMETHING` varchar(256) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Дело в том, что я не знаю, какой sql Keycloak будет выполняться, когда он получит запрос на регистрацию от своего адаптера, и я не могу воспроизвести проблему с моей таблицей.

1 Ответ

0 голосов
/ 04 июля 2019

ОК ... Оказывается, что-то вроде этого:

, когда Keycloak добавляет строку в эту таблицу, он пытается сначала добавить строку только с ID (для проверки с конфликтом UUID?),затем обновите эту строку в полном контексте.

Так что этот триггер верен в логике, но он вернет первичный ключ только потому, что в точке вставки больше ничего нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...