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

Trigger de relaciones de clave primaria

Estas en el tema de Trigger de relaciones de clave primaria en el foro de Mysql en Foros del Web. Buenas, es la primera vez que cuelgo un post pidiendo ayuda, ya que me gusta encontrar las cosas por mi mismo. Pero esta vez he ...
  #1 (permalink)  
Antiguo 14/08/2011, 07:34
 
Fecha de Ingreso: marzo-2010
Mensajes: 8
Antigüedad: 14 años, 8 meses
Puntos: 1
Trigger de relaciones de clave primaria

Buenas, es la primera vez que cuelgo un post pidiendo ayuda, ya que me gusta encontrar las cosas por mi mismo. Pero esta vez he probado con todo y no soy capaz de ver porque no me sale.

Necesito crear para mi web un trigger que me cree las relaciones entre la base de datos automáticamente. Se trata de dos tablas la de usuarios y la de privilegios, que en una relación N:M se crea una tercera tabla llamada UserPrivileges. Necesito que al entrar un usuario se cree automáticamente todos los privilegios en la N:M que existan en la tabla de privilegios, y viceversa, que cuando cree un privilegio se les sume a todos los usuarios el nuevo privilegio en type = reject.

El Trigger para los privilegios creo que está bien y ha de funcionar, pero como no me funciona el de usuarios no puedo provarlo. El de privilegios es este:
Código PHP:
delimiter $$

CREATE TRIGGER privilegeInsert BEFORE INSERT ON Privilege
  
FOR EACH ROW 
BEGIN
    INSERT INTO UsersPrivilege SET privilege 
= NEW.privilege;
    
UPDATE UsersPrivilege SET type 'reject' where privilege = NEW.privilege;
  
END
$$ 
Y el de users:

Código PHP:
CREATE TRIGGER userInsert AFTER INSERT ON Users
  
FOR EACH ROW 
BEGIN
    
declare i int;
    
= (SELECT idPrivilege FROM Privilege ORDER BY idPrivilege DESC LIMIT 1);
    WHILE 
DO
    
INSERT INTO UsersPrivilege SET idUser = (SELECT idUser FROM Users ORDER BY idUser DESC LIMIT 1); AND SET 
    usersPrivilegeType 
'reject' AND SET privilege = (SELECT privilege FROM privilege where idPrivilege i);
    
END;
  
END
$$
delimiter 
Si alguien sabe la respuesta, o sabe el porque lo estoy haciendo mal, estaría muy agradecido.

Un saludo, ánimo y suerte :D

Última edición por jonator; 14/08/2011 a las 07:45
  #2 (permalink)  
Antiguo 14/08/2011, 14:35
 
Fecha de Ingreso: mayo-2011
Mensajes: 44
Antigüedad: 13 años, 6 meses
Puntos: 2
Respuesta: Trigger de relaciones de clave primaria

mas no me equivoco lo que quieres es que cuando se cree un usuario o un privilegio, esta creacion actualiza la tabla de usuariosPrivilegios.

en ese caso primero que todo mas no me equivoco el primer trigger el de privilegios estaria malo por que no dices que usuario le estas poniendo el nuevo privilegio, creo yo si es que tienes integridad referencial, ahora bien eso se soluciona con una insercion masiva
seria asi
[code]
INSERT INTO `UsersPrivilege ` (`usuario`,`privilegio`)
SELECT DISTINCT usuario,NEW.privilege from UsersPrivilege ;
[code]
esto inserta el nuevo privilegio por cada usuario en la tabla privilegio, si quieres puedes cambiar la tabla UsersPrivilege por la de usuarios daria lo mismo =)

ahora en el segundo trigger no entiendo muy bien para que es el while que haces, pero si lo que deseas es poner el nuevo usuario con todos los privilegios seria parecido a lo anterior
[code]
INSERT INTO `UsersPrivilege ` (`usuario`,`privilegio`)
SELECT DISTINCT NEW.user,privilegio from UsersPrivilege ;
[code]
igual que el anterior puedes cambiar la tabla UsersPrivilege por la de privilegios

espero que te sirva mi respuesta y si no me dices para seguir ayudandote
  #3 (permalink)  
Antiguo 16/08/2011, 10:44
 
Fecha de Ingreso: marzo-2010
Mensajes: 8
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Trigger de relaciones de clave primaria

Muchas gracias! No conocía esta manera de hacerlo, me la apunto para más adelante :D

Etiquetas: clave, primaria, relaciones, select, tabla, 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 12:28.