webew
Войти » Регистрация
 
MySQL/MariaDB

trigger

11 июня 2011, 18:07
Автор: Alek
Возможно ли из триггера запустить хранимую процедуру и как это сделать?
Триггер должен реагировать на вставку в таблицу строки, получать значение N поля и передавать ее в ХП....
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

rgbeast

Это можно сделать. Значения полей нужно передавать в ХП как аргумент. Обсуждение и пример см. на форуме mysql.com
12.06.2011, 00:15
Ответить
NO USERPIC

Alek

CREATE TRIGGER up AFTER INSERT ON loks
FOR EACH ROW
BEGIN
CALL z(NEW.x, NEW.y);
END

после вставки в таблицу выдает :#1422 - Explicit or implicit commit is not allowed in stored function or trigger. В ЧЕМ проблема не подскажите!?
12.06.2011, 01:33
Ответить
NO USERPIC

rgbeast

Приведите также код хранимой процедуры. Дело в том, что ХП, вызванная из триггера имеет такие же ограничения, как и триггер. Скорее всего вы используете в ней DDL (например, CREATE TABLE, DROP TABLE, TRUNCATE), которые вызывают неявный commit, что недопустимо. Если используете TRUNCATE, замените его на DELETE.
12.06.2011, 10:06
Ответить
NO USERPIC

Alek

Скорее всего вы используете в ней DDL (например, CREATE TABLE, DROP TABLE, TRUNCATE), которые вызывают неявный commit, что недопустимо
Да, вы правы в ХП присутствует CREATE TABLE !

простенькая процедура....
CREATE PROCEDURE z()
BEGIN
CREATE TABLE a(field_1 INT);      
END

В этом духе в общем!
Получается невозможное действие или все же можно что то с этим сделать??
12.06.2011, 17:41
Ответить
NO USERPIC

rgbeast

CREATE TABLE в триггере запрещено (также и в ХП вызываемой из триггера). Сделать можно несколько вещей:
1. изменить логику работы и избавиться от CREATE TABLE в процедуре - например создать все необходимые таблицы заранее
2. сделать создание таблиц асинхронным - в самой процедуре только лишь записывать в сторонную инормацию о том, какую таблицу создать, а реально создавать таблицу после другим вызовом
12.06.2011, 23:32
Ответить
NO USERPIC

Alek

спасибо за советы! надо буде попробовать!
логика такова:
1)при регистрации пользователя общие данные заносятся в основную таблицу
2)создается индивидуальная таблица пользователя с некоторыми значениями по умолчанию
ну а после к этой таблице будут все основные запросы! Можно конечно было заранее создать такую таблицу для всех, но некоторые поля в этой таблице будут содержать до 1000 строк, мне будет проще контролировать индивидуальные таблицы....это конечно можно реализовать простыми запросами, но хотелось бы перенести некоторый функционал в саму базу!
13.06.2011, 00:48
Ответить
NO USERPIC

rgbeast

Возможно, не нужно переносить такую сложную логику в базу - нужно находить баланс. Если триггер есть на INSERT, по логике нужно триггеры и на UPDATE и на DELETE - логика усложняется и не факт, что будет автоматически гарантировать целостность базы.
13.06.2011, 01:47
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: