Mysql,在触发器中插入不应该插入NULL值

标签 mysql keycloak

逻辑是当在Keycloak用户表中插入一行时,在另一个数据库的表中添加一行。(我猜很简单) 发生的情况是只有 Key 有值,其余的都插入了 NULL(它们确实有值,在触发发生之前它们都已正确插入到 KeyCloak 表中)

凯撒也有同样的问题,但他的解决方案不起作用。 MySQL "After Insert" Trigger keeps inserting nulls

我正在使用 PHPMyAdmin for 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 那么造成这个问题的原因是什么呢?

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

问题是我不知道当 Keycloak 从其适配器接收到注册请求时将执行什么 sql,并且我无法用我的表重现问题。

最佳答案

好的... 结果是这样的:

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

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

关于Mysql,在触发器中插入不应该插入NULL值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56685079/

相关文章:

php - 使用 GROUP BY 和 ORDER BY 条件在两个 MySQL 表上加入与联合

mysql - UNION SELECT 不显示所有列

java - Keycloak注销不会结束 session

PHP MySQL 多个搜索单词使用数组进行单词到单词的翻译

MySQL WHERE 喜欢和或

MySQL 通配符查询

ssl - 使用 Keycloak 设置 Traefik 返回 500

java - 尝试为 Keycloak 创建自定义身份 validator 提供程序时,来自 Maven 部署的 NoClassDefFoundError

oauth-2.0 - Keycloak,客户端之间共享资源

jhipster - 如何在 jhipster 应用程序中为 keycloak 指定策略执行器?