Как установить триггер для вставки в другую таблицу из другой схемы? - PullRequest
0 голосов
/ 13 мая 2019

Как установить триггер для вставки в другую таблицу из другой схемы?


Краткое объяснение

Рассмотрение схемы "S"и схемы" 1 "до" n ".Учтите, что в схеме «S» есть таблица Users и таблица Company.Таблица пользователей имеет отношение 1: 1 к таблице Company.Каждый пользователь находится в компании.В таблице Company есть столбец "схема" (varchar (255))

В схеме "S" определены таблица Users и таблица Company.Любая другая схема должна иметь копию таблицы Users.

Однако таблица Users модифицируется только в схеме S.

Каждый раз, когда таблица Users в схеме "S" изменяется, я хочуповторить изменения в схеме 'n' ЕСЛИ и только ЕСЛИ столбец «схема» в таблице «Компания» == 'n'.

Это ограничение отличает этот вопрос от другихвопросы!

Ах да:

  • Все схемы остаются в одной базе данных.

Illustration of the issue

Пример

Рассмотрим таблицу У пользователей есть следующие столбцы:

  • Id - int

  • имя пользователя - Varchar (255)

  • dateBirth - Дата

  • idCompany - FK int

Рассмотрим таблицу, в которой компания имеет следующие столбцы:

  • Id - int
  • схема - Varchar (255)

Когда я делаювставить в таблицу «Пользователи» схему «S»Я хочу, чтобы произошло следующее:

    if User.Company.schema == "schema A"{

        replicate to schema "A";

    } else if User.Company.schema == "schema N"{
        replicate to schema "N";
    }
....

Я запутался в том, как сделать эту логику в приведенном ниже коде:

CREATE DEFINER=`root`@`localhost` TRIGGER `user_AFTER_INSERT` AFTER INSERT ON `user` FOR EACH ROW BEGIN

END

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Вам потребуется использовать динамический SQL для построения INSERT запроса к другой базе данных:

CREATE DEFINER=`root`@`localhost` TRIGGER `user_AFTER_INSERT` AFTER INSERT ON `user` 
FOR EACH ROW 
BEGIN
  SELECT schema INTO @schema FROM Company WHERE Id = NEW.idCompany;
  SET @sql = CONCAT('INSERT INTO `', @schema, '`.`Users` (id, username, dateBirth, idCompany) VALUES(?, ?, ?, ?)';
  PREPARE stmt FROM @sql;
  SET @id = NEW.id;
  SET @username = NEW.username;
  SET @dateBirth = NEW.dateBirth;
  SET @idCompany = NEW.idCompany;
  EXECUTE stmt USING @id, @username, @dateBirth, @idCompany;
  DEALLOCATE PREPARE stmt;
END
0 голосов
/ 13 мая 2019

Я ничего не знаю о Hybernate, но, учитывая, что вы хотите, чтобы эти таблицы были только для чтения, представления могут работать. Попробуйте что-то вроде следующего (некоторые имена были вычеркнуты из-за недостатка детализации в вопросе) вместо ваших утверждений CREATE TABLE для таблиц Company.

CREATE VIEW users AS
SELECT `id`, `username`, `dateBirth`, `schema`
FROM S.users
WHERE `schema` = 'schema X';

Если это работает, это экономит все накладные расходы на репликацию.

...