MySQL,插入触发器时应插入NULL值,

时间:2019-06-20 11:33:28

标签: mysql keycloak

逻辑是在Keycloak用户表中插入行时在另一个DB的表中添加行。(我想这很简单) 发生了什么,只有键才有值,其余的都插入了NULL(它们确实有值,它们都在触发发生之前正确插入了KeyCloak表中)

Caesar遇到了同样的问题,但不适用于他的解决方案。 MySQL "After Insert" Trigger keeps inserting nulls

我正在使用PHPMyAdmin for Mysql 会自动添加一些代码,例如“对于每一行...”

名称:添加
表格:USER_ENTITY
时间:AFTER
事件:INSERT
定义:

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 那么,此问题的原因是什么?

编辑6月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. 

Keycloak的USER_ENTITY表更长,但是可能是问题所在:

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 :(得分:0)

好的... 原来是这样的:

当Keycloak向该表中添加一行时,它将尝试首先添加仅具有ID的行(以测试是否与UUID冲突?),然后使用完整的上下文更新到该行。

因此该触发器在逻辑上是正确的,但它只会取回主键,因为在插入点没有其他东西。