Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

error raro de un TRIGGER

Estas en el tema de error raro de un TRIGGER en el foro de Mysql en Foros del Web. Hola: El proyecto en el que estoy metido requiere el uso de muchas base de datos por lo que desde el php defino variables para ...
  #1 (permalink)  
Antiguo 15/11/2010, 07:59
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
error raro de un TRIGGER

Hola:

El proyecto en el que estoy metido requiere el uso de muchas base de datos por lo que desde el php defino variables para el acceso a todas ellas, pero cuando hago un TRIGGER, me da un mensaje de error que dice "NO DATA BASE SELECTED". en fin mejor lo ejemplifico

Mis consultas son:
Cita:
SELECT * FROM sipp.objetivos
por lo tanto el trigger es:
Cita:
CREATE TRIGGER testigo BEFORE INSERT ON sipp.ss_asd
FOR EACH ROW
INSERT INTO sipp.jehova VALUES (NEW.idas,NEW.dp,NEW.idant);
pero me sale este error

Cita:
NO DATA BASE SELECTED
pero si elimino el nombre de la base de datos, y antes selecciono la base de datos:
Código PHP:
$db mysql_select_db('sipp',$link);
$sql "CREATE TRIGGER testigo BEFORE INSERT ON ss_asd
        FOR EACH ROW
        INSERT INTO jehova VALUES (NEW.idas,NEW.dp,NEW.idant);    "
;
$sql mysql_query($sql) or die(mysql_error()); 
Esto si funciona.

Por que tal diferencia?
  #2 (permalink)  
Antiguo 15/11/2010, 10:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Tema movido desde PHP a Mysql
  #3 (permalink)  
Antiguo 15/11/2010, 10:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: error raro de un TRIGGER

Antes de crear el trigger dentro de la base debes seleccionar (cambiar a...) la base de datos donde el trigger estará.
Los triggers, así como los procedimientos almacenados y las funciones almacenadas pertenecen a una sola base de datos, por lo que para poder crearlos se requiere que la conexión se encuentr en esa base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 15/11/2010, 14:03
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: error raro de un TRIGGER

Ok, entonces estoy forzado a:
Cita:
$db = mysql_select_db('sipp',$link);
en el entendido de que los TRIGGERS no aceptan:

Cita:
CREATE TRIGGER testigo BEFORE INSERT ON sipp.ss_asd
considerando que sipp es la base de datos y ss_asd es la tabla??
  #5 (permalink)  
Antiguo 15/11/2010, 16:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: error raro de un TRIGGER

Si no me equivoco, es un problema de implementación en MySQL. A diferencia de los stored procedures, los TRIGGERS no se almacenan en la misma parte que las rutinas (information_schema.routines), sino como scripts en la misma carpeta de la base de la que dependen. Por eso, a menos que estés posicionado en la misma, no pueden grabarse.
Mira el modelo que aparece en el manual de referencia (Sintaxis de CREATE TRIGGER) y verás que el modelo no contiene indicación de la base, sino solamente de la tabla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 15/11/2010, 16:51
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 10 meses
Puntos: 12
Respuesta: error raro de un TRIGGER

Investigaré un poco más al respecto, agradezco tu respuesta
  #7 (permalink)  
Antiguo 16/11/2010, 07:47
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: error raro de un TRIGGER

Los triggers pueden ser consultados desde information_schema.triggers y estos si se crean para cada base de datos.
Código MySQL:
Ver original
  1. mysql> DESC information_schema.triggers;
  2. +----------------------------+--------------+------+-----+---------+-------+
  3. | Field                      | Type         | Null | Key | Default | Extra |
  4. +----------------------------+--------------+------+-----+---------+-------+
  5. | TRIGGER_CATALOG            | varchar(512) | YES  |     | NULL    |       |
  6. | TRIGGER_SCHEMA             | varchar(64)  | NO   |     |         |       |
  7. | TRIGGER_NAME               | varchar(64)  | NO   |     |         |       |
  8. | EVENT_MANIPULATION         | varchar(6)   | NO   |     |         |       |
  9. | EVENT_OBJECT_CATALOG       | varchar(512) | YES  |     | NULL    |       |
  10. | EVENT_OBJECT_SCHEMA        | varchar(64)  | NO   |     |         |       |
  11. | EVENT_OBJECT_TABLE         | varchar(64)  | NO   |     |         |       |
  12. | ACTION_ORDER               | bigint(4)    | NO   |     | 0       |       |
  13. | ACTION_CONDITION           | longtext     | YES  |     | NULL    |       |
  14. | ACTION_STATEMENT           | longtext     | NO   |     |         |       |
  15. | ACTION_ORIENTATION         | varchar(9)   | NO   |     |         |       |
  16. | ACTION_TIMING              | varchar(6)   | NO   |     |         |       |
  17. | ACTION_REFERENCE_OLD_TABLE | varchar(64)  | YES  |     | NULL    |       |
  18. | ACTION_REFERENCE_NEW_TABLE | varchar(64)  | YES  |     | NULL    |       |
  19. | ACTION_REFERENCE_OLD_ROW   | varchar(3)   | NO   |     |         |       |
  20. | ACTION_REFERENCE_NEW_ROW   | varchar(3)   | NO   |     |         |       |
  21. | CREATED                    | datetime     | YES  |     | NULL    |       |
  22. | SQL_MODE                   | longtext     | NO   |     |         |       |
  23. | DEFINER                    | longtext     | NO   |     |         |       |
  24. +----------------------------+--------------+------+-----+---------+-------+
  25. 19 rows in set (0.00 sec)

al momento de hacer un selected_db y crear el trigger el campo trigger_schema almacena la base de datos donde fue creada.

No se bien que tratas de hacer desde php y cual es la logica de tu sistema, pero estas practicas no son para nada recomendables y mucho menos en la creación de triggers.

Si bien los triggers son una excelente herramienta, su uso debe ser moderado. Llega un punto donde es muy dificil detectar inconsistencias en el sistema a causa de estos objetos. Si a esto le adicionas que desde un sistema web, un usuario va a poder crear triggers tu sistema puede convertirse en un verdadero caos.

Si nos cuentas un poco mas que quieres hacer, te podemos recomendar una solución mas adecuada al problema.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 16/11/2010, 08:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: error raro de un TRIGGER

Tienes razón Huesos52, se me había pasado por alto, pero la columna ACTION_STATEMENT de esa tabla si conserva el código.
De todos modos, los scripts de los trigger quedan también almacenados en la carpeta de la base de datos con la extensión .TRG, por lo que el problema posiblemente tenga relación con eso.
Habría que ver más documentación respecto a la forma en que fueron implementados en MySQL para entender el asunto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: raro, trigger
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:05.