逻辑是在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,并且我无法重现表的问题。
答案 0 :(得分:0)
好的... 原来是这样的:
当Keycloak向该表中添加一行时,它将尝试首先添加仅具有ID的行(以测试是否与UUID冲突?),然后使用完整的上下文更新到该行。
因此该触发器在逻辑上是正确的,但它只会取回主键,因为在插入点没有其他东西。