【问题标题】:Mysql, insertion in trigger inserting NULL values while shouldn'tMysql,在触发器中插入 NULL 值而不应该插入
【发布时间】:2019-11-03 05:18:31
【问题描述】:

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

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

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

名称:添加
表: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 并且我无法重现我的表的问题。

【问题讨论】:

标签: mysql keycloak


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    相关资源
    最近更新 更多