powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / простой тригер на добавление имени пользователя в таблицу
6 сообщений из 6, страница 1 из 1
простой тригер на добавление имени пользователя в таблицу
    #39168477
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые коллеги, добрый день, прошу помочь.
Помогите пожалуйста создать простой триггер , который при добавлении каких либо записей в таблицу вставляет в одно из полей данной таблицы значение имени текущего пользователя, по всему списку новых добавляемых записей.
Ход мысли встал на следующем выражении:

Код: plsql
1.
2.
3.
4.
5.
CREATE TRIGGER `ADDING_USER` BEFORE INSERT ON db_trade.tbl_goods
FOR EACH ROW
BEGIN
INSERT INTO db_trade.tbl_goods SET tbl_goods.user_log = SUBSTRING_INDEX(user(),'@',1);
END



Только осваиваю синтаксис, прошу помочь.
...
Рейтинг: 0 / 0
простой тригер на добавление имени пользователя в таблицу
    #39168485
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В триггере надо не ещё одну запись вставлять, а присваивать требуемое значение требуемому полю псевдотаблицы NEW. Т.е.
Код: sql
1.
2.
3.
CREATE TRIGGER `ADDING_USER` BEFORE INSERT ON db_trade.tbl_goods
FOR EACH ROW
SET NEW.user_log = SUBSTRING_INDEX(user(),'@',1);
...
Рейтинг: 0 / 0
простой тригер на добавление имени пользователя в таблицу
    #39168492
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Спасибо большое, как всегда выручаете!) процесс пошел)
...
Рейтинг: 0 / 0
простой тригер на добавление имени пользователя в таблицу
    #39169396
XsevenBeta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу предостеречь - с триггерами есть один неприятный момент. Если по каким-то причинам триггер не сработал - например, прибавилось колво полей в таблице куда триггер записи вставляет. То операция которую тригер инициировал тоже не сработает.
А это может быть не приятно. Для того чтобы этого не происходило - необходимо добавлять эксепшены (обработку ошибок) в триггере. Но в триггерах mysql это делать нельзя, как я понимаю.. Поэтому придётся делать это в процедуре, передавая ей параметры.
Что касается триггеров, приведу простой пример (недавно как раз делал, я специалист по торгово-кассовым системам):

1. Создание таблицы log.srv_userlog для ведения лога
DROP TABLE IF EXISTS `log.srv_userlog`;
CREATE TABLE `log.srv_userlog` (
`action` varchar(20) DEFAULT NULL COMMENT 'update,delete,insert',
`id` varchar(40) NOT NULL COMMENT 'user_id',
`role_id` varchar(40) NOT NULL,
`username` varchar(32) NOT NULL,
`properties` varchar(40) NOT NULL,
`title` text,
`version` int(11) NOT NULL,
`deleted` tinyint(4) NOT NULL,
`logcre` datetime NOT NULL,
`loguser` varchar(255) DEFAULT NULL,
`logconnect` varchar(255) DEFAULT NULL,
`logdatabase` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. Создание таблицы log.srv_users_tabel для ведения соответсвия id пользователя и его табельного номера.
CREATE TABLE `log.srv_users_tabel` (
`global_id` int(11) DEFAULT NULL,
`id` varchar(40) NOT NULL,
`tabel` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. Создание функции, которая берёт табельный номер из title пользователя в ukmserver.
DELIMITER //
CREATE FUNCTION ukmserver.tabel_from_title (title TEXT)
RETURNS TEXT CHARSET utf8
BEGIN
DECLARE res TEXT;
SET res=TRIM(SUBSTRING(title,LOCATE('(',title)+1,(LOCATE(')',title))-LOCATE('(',title)-1));
RETURN res;
END
//
DELIMITER ;

4. Добавление триггеров: srv_user_tr_upd,srv_user_tr_del,srv_user_tr_ins в БД ukmserver на СГО.
Триггеры пишут лог и ведут соответсвие табельных номеров и id

DELIMITER $$
CREATE
TRIGGER ukmserver.srv_user_tr_upd AFTER UPDATE
ON ukmserver.srv_user
FOR EACH ROW BEGIN
IF ((LOCATE('(',old.title)=0) OR (LOCATE(')',old.title)=0))
THEN
-- Нет скобок - значит вводят без табельного номера.
INSERT INTO log.srv_userlog SELECT 'UpdateI',old.id,old.role_id,old.username,old.properties,old.title,old.version,old.deleted,NOW(),USER(),CURRENT_USER(),DATABASE();
-- UpdateI - update incrorrect
ELSE
-- искать юзера. Если юзера нет - добавить, если есть - апдейт.
INSERT INTO log.srv_userlog SELECT 'Update',old.id,old.role_id,old.username,old.properties,old.title,old.version,old.deleted,NOW(),USER(),CURRENT_USER(),DATABASE();
REPLACE INTO log.srv_users_tabel SELECT old.global_id,old.id,ukmserver.tabel_from_title(old.title);
END IF;
END$$
DELIMITER ;


DELIMITER $$
CREATE
TRIGGER ukmserver.srv_user_tr_ins AFTER INSERT
ON ukmserver.srv_user
FOR EACH ROW BEGIN
IF ((LOCATE('(',new.title)=0) OR (LOCATE(')',new.title)=0))
THEN
-- Нет скобок - значит вводят без табельного номера.
INSERT INTO log.srv_userlog SELECT 'InsertI',NEW.id,NEW.role_id,NEW.username,NEW.properties,NEW.title,NEW.version,new.deleted,NOW(),USER(),CURRENT_USER(),DATABASE();
-- UpdateI - update incrorrect
ELSE
-- искать юзера. Если юзера нет - добавить, если есть - апдейт.
INSERT INTO log.srv_userlog SELECT 'Insert',NEW.id,NEW.role_id,NEW.username,NEW.properties,NEW.title,NEW.version,new.deleted,NOW(),USER(),CURRENT_USER(),DATABASE();
REPLACE INTO log.srv_users_tabel SELECT new.global_id,new.id,ukmserver.tabel_from_title(new.title);
END IF;
END$$
DELIMITER ;

DELIMITER $$
CREATE
TRIGGER ukmserver.srv_user_tr_del AFTER DELETE
ON ukmserver.srv_user
FOR EACH ROW BEGIN
INSERT INTO log.srv_userlog SELECT 'Delete',old.id,old.role_id,old.username,old.properties,old.title,old.version,old.deleted,NOW(),USER(),CURRENT_USER(),DATABASE();
END$$
DELIMITER ;
...
Рейтинг: 0 / 0
простой тригер на добавление имени пользователя в таблицу
    #39169527
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XsevenBetaХочу предостеречь - с триггерами есть один неприятный момент.Не один.

XsevenBetaЕсли по каким-то причинам триггер не сработал - например, прибавилось колво полей в таблице куда триггер записи вставляет.Изменение структуры не может быть причиной НЕсрабатывания триггера.

XsevenBetaнеобходимо добавлять эксепшены (обработку ошибок) в триггере. Но в триггерах mysql это делать нельзя, как я понимаю..RTFM SIGNAL и HANDLER

XsevenBetaЧто касается триггеров, приведу простой примерЭто УЖАСНО... Да и логика происходящего не видна совершенно. Это даже без учёта того, что не каждое потенциально возможное событие изменения данных контролируемой таблицы вызовет выполнение триггера...
Что же до купирования доступа к данным и выноса логики в процедуры - это нормальный подход и безотносительно к триггерам.
...
Рейтинг: 0 / 0
простой тригер на добавление имени пользователя в таблицу
    #39169866
XsevenBeta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaXsevenBetaXsevenBetaЕсли по каким-то причинам триггер не сработал - например, прибавилось колво полей в таблице куда триггер записи вставляет.Изменение структуры не может быть причиной НЕсрабатывания триггера.
Я имею в виду, что применительно к моим триггерам:
Если изменили структуру таблицы, куда триггер вставляет записи - то триггер не вставит по понятным причинам в неё данные. И в таком случае не сработает то, что и вызвало триггер. Так?

AkinaXsevenBetaнеобходимо добавлять эксепшены (обработку ошибок) в триггере. Но в триггерах mysql это делать нельзя, как я понимаю..RTFM SIGNAL и HANDLER
Одна дока смутила - я подумал можно только в процедурах хэндлеры использовать. Спасибо.

AkinaXsevenBetaЧто касается триггеров, приведу простой примерЭто УЖАСНО... Да и логика происходящего не видна совершенно. Это даже без учёта того, что не каждое потенциально возможное событие изменения данных контролируемой таблицы вызовет выполнение триггера...
Какое изменение данных контролируемой таблицы не вызовет выполнение триггера? Что тут не так? (мне не нужны готовые запросы, хотя бы в общем виде поясните пожалуйста).
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / простой тригер на добавление имени пользователя в таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]