2016-11-21 2 views
0

Как я могу обнаружить триггер в своем подчиненном устройстве, который был вызван реплицированным выражением в MySQL?Определить, что триггер в подчиненном вызове был вызван реплицированным утверждением

Я попытался с функцией USER(), но он возвращает null, когда триггер активируется реплицированным утверждением. Должен ли он возвращать пользователя репликации (repl)?

Пример:

CREATE TRIGGER `test`.`t1_BEFORE_INSERT` BEFORE INSERT ON `t1` FOR EACH ROW 
BEGIN 
    IF USER() LIKE '[email protected]%' 
    THEN 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error'; 
    END IF; 
END 

Я хочу, чтобы поведение триггера будет отличаться в зависимости от он активируется реплицированного заявление или нет. Я настроил репликацию на основе инструкций, и я проверил, что триггеры запускаются в моем подчиненном устройстве.

ответ

1

Попробуйте проверку @@server_id. Это глобальная переменная, которая должна быть уникальной для каждого экземпляра MySQL в наборе реплик.

Другим вариантом может быть изменение кода запуска на ведомом устройстве. Обычно мне не нравится это делать, потому что я предпочел бы, чтобы все объекты схемы были идентичны между ведущим и ведомым.

PS: Вы уже знаете это, но в интересах других читателей: обратите внимание, что реплицированные события не запускают триггеры, если вы используете репликацию на основе строк. Это означает, что вы получаете смешанные результаты, если вы использовали репликацию смешанного режима, потому что события будут регистрироваться в строчном формате, если SQL небезопасен для репликации.


Re ваш комментарий:

Что касается тестирования пользователя, нет сеанса пользователя в потоке репликации. Репликационный поток эффективно работает без каких-либо ограничений в отношении системы привилегий SQL (он может выполнять любые изменения в бинарном потоке журналов), поэтому нет необходимости связывать этот поток с пользователем.

Так что неудивительно, что USER() возвращает NULL.

Вы можете попробовать тестирование на что:

IF USER() IS NULL THEN ... 

Кстати, нет фактически никакой информации в вашем вопросе выше, что говорит о том, что триггер существует только на ведомом.

+0

Это не сработает. Эта переменная будет иметь такое же значение независимо от того, какой пользователь запускает триггер. Если вы внимательно прочитаете, я уже спрашиваю о спусковом крючке в подчиненном, у меня нет триггеров в мастер. – antgar9

Смежные вопросы