|
|
|
простой тригер на добавление имени пользователя в таблицу
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги, добрый день, прошу помочь. Помогите пожалуйста создать простой триггер , который при добавлении каких либо записей в таблицу вставляет в одно из полей данной таблицы значение имени текущего пользователя, по всему списку новых добавляемых записей. Ход мысли встал на следующем выражении: Код: plsql 1. 2. 3. 4. 5. Только осваиваю синтаксис, прошу помочь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2016, 13:02:00 |
|
||
|
простой тригер на добавление имени пользователя в таблицу
|
|||
|---|---|---|---|
|
#18+
В триггере надо не ещё одну запись вставлять, а присваивать требуемое значение требуемому полю псевдотаблицы NEW. Т.е. Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2016, 13:06:20 |
|
||
|
простой тригер на добавление имени пользователя в таблицу
|
|||
|---|---|---|---|
|
#18+
Akina, Спасибо большое, как всегда выручаете!) процесс пошел) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2016, 13:15:10 |
|
||
|
простой тригер на добавление имени пользователя в таблицу
|
|||
|---|---|---|---|
|
#18+
Хочу предостеречь - с триггерами есть один неприятный момент. Если по каким-то причинам триггер не сработал - например, прибавилось колво полей в таблице куда триггер записи вставляет. То операция которую тригер инициировал тоже не сработает. А это может быть не приятно. Для того чтобы этого не происходило - необходимо добавлять эксепшены (обработку ошибок) в триггере. Но в триггерах 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 ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 11:49:28 |
|
||
|
простой тригер на добавление имени пользователя в таблицу
|
|||
|---|---|---|---|
|
#18+
XsevenBetaХочу предостеречь - с триггерами есть один неприятный момент.Не один. XsevenBetaЕсли по каким-то причинам триггер не сработал - например, прибавилось колво полей в таблице куда триггер записи вставляет.Изменение структуры не может быть причиной НЕсрабатывания триггера. XsevenBetaнеобходимо добавлять эксепшены (обработку ошибок) в триггере. Но в триггерах mysql это делать нельзя, как я понимаю..RTFM SIGNAL и HANDLER XsevenBetaЧто касается триггеров, приведу простой примерЭто УЖАСНО... Да и логика происходящего не видна совершенно. Это даже без учёта того, что не каждое потенциально возможное событие изменения данных контролируемой таблицы вызовет выполнение триггера... Что же до купирования доступа к данным и выноса логики в процедуры - это нормальный подход и безотносительно к триггерам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 13:34:55 |
|
||
|
простой тригер на добавление имени пользователя в таблицу
|
|||
|---|---|---|---|
|
#18+
AkinaXsevenBetaXsevenBetaЕсли по каким-то причинам триггер не сработал - например, прибавилось колво полей в таблице куда триггер записи вставляет.Изменение структуры не может быть причиной НЕсрабатывания триггера. Я имею в виду, что применительно к моим триггерам: Если изменили структуру таблицы, куда триггер вставляет записи - то триггер не вставит по понятным причинам в неё данные. И в таком случае не сработает то, что и вызвало триггер. Так? AkinaXsevenBetaнеобходимо добавлять эксепшены (обработку ошибок) в триггере. Но в триггерах mysql это делать нельзя, как я понимаю..RTFM SIGNAL и HANDLER Одна дока смутила - я подумал можно только в процедурах хэндлеры использовать. Спасибо. AkinaXsevenBetaЧто касается триггеров, приведу простой примерЭто УЖАСНО... Да и логика происходящего не видна совершенно. Это даже без учёта того, что не каждое потенциально возможное событие изменения данных контролируемой таблицы вызовет выполнение триггера... Какое изменение данных контролируемой таблицы не вызовет выполнение триггера? Что тут не так? (мне не нужны готовые запросы, хотя бы в общем виде поясните пожалуйста). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2016, 18:48:27 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=111&tid=1832160]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 382ms |

| 0 / 0 |
