Como evitar la inserción de más de dos elementos en una tabla?

tor
05 de Junio del 2006
Primero de todo, buenas a todos. Soy nuevo en esto de las BBDD y en oracle. Mi problema es que quiero que una tabla de directivos tenga como maximo dos. He estado provando con triggers, haciendo una consulta a la misma tabla antes de insertar pero al ejecutarlo me dava errores. Aki os dejo el codigo del trigger a ver que os parece:

CREATE OR REPLACE TRIGGER Insert_directivo AFTER INSERT ON Directivo
FOR EACH ROW
DECLARE

max_directivos INTEGER:=2;
num_directivos INTEGER;

BEGIN
SELECT COUNT(*) INTO num_directivos FROM Directivo;
IF (num_directivos >= max_directivos )
THEN raise_application_error(-20601, 'intento de insertar un 3r directivo');
END IF;
END;

Espero respuestas gracias

tor
05 de Junio del 2006
Muchas gracias chicos, ya he arreglado el problema, el problema estava en el raise, lo que passa es que aki en la web no sé ve porque cambié el texto(lo siento), pero antes tenia un \' enmedio y era ese el error que encontrava. Gracias a la instruccion compile y a lo del show errors, he encontrado el error. Por cierto alfaq en lo del before tenias razon, la intencion era que lo mirara antes, y respecto a lo del raise a mi no me ha dado ningun problema, lo que consigo con el raise es que si alguien inserta un 3r directivo le sale el error que yo escribo, mas los que pone oracle, pero creo que no queda del todo mal, se entiende mejor en que la estas cagando. Tambien he quitado el texto "FOR EACH ROW" ya que el trigger afecta a la insercion en la tabla y no a una sola fila.
Y nada mas, muchas gracias a los que me habeis ayudado y a ver si esto sirve para algun que otro novato com yo que se encuentre en la misma situación.

Aki os pongo el trozo de codigo que ha kedado:
CREATE OR REPLACE TRIGGER Insert_directivo BEFORE INSERT ON Directivo
DECLARE

max_directivos INTEGER:=2;
num_directivos INTEGER;

BEGIN
SELECT COUNT(*) INTO num_directivos FROM Directivo;
IF (num_directivos >= max_directivos )
THEN raise_application_error(-20601, \'intento de insertar un 3r directivo\');
END IF;
END;

Alex
05 de Junio del 2006
¿ No has puesto esto ya el otro dia ?

Pero bueno, como el que la sigue, la consigue vamos a ver :

Dices que te da errores ¿ los puedes poner o te quema el teclado ?.

Venga, te ahorro el trabajo. Te dá error de tabla mutando ¿ verdad ?

Así, a bote pronto, aunque seguro que hay mas soluciones a este espinoso enigma, se me ocurren tres cosas, 2 faciles y una dificil, elige la que quieras: las polleces o la cojonera que te va a costar sacarla, pero que a ti , que estás empezando en esto del oracle te va a servir de mucho, allá van :

1-) Cada vez que insertes un directivo, primero añades una linea a un fichero plano con el utl_file, luego cuentas las lineas que tiene y si tiene 3... VOILÁ, a raisear tocan y a crear de nuevo el fichero con dos lineas ( esto se aplica tb a los deletes sobre esa tabla, no lo olvides )
2-) create una tabla con un unico campo y cada vez que modifiques la tabla directivos actualiza ese campo.
3-) Te recomiendo está para que te pelees y aprendas, es la solución que propone Oracle para este problema, pero avisa de que no es efectivo 100x100. Create un paquete de BBDD y utiliza una tabla pl-sql. No me digas que te ponga un ejemplo porqué no lo voy hacer, ahorrate el trabajo. Lo que si puedes hacer es buscar en el google esto : << MUTATING TABLE ORACLE, PACKAGE >>. Seguro que encuentras mucha documentacion al respecto.


tor
05 de Junio del 2006
Primero de todo gracias por contestar, es verdad que lo puse el otro dia pero como nadie dijo nada, pues lo he puesto otra vez pero con el codigo del trigger. El error no lo puse porque no creia que sirviera de nada, es este:

Warning: Trigger created with compilation errors.

Que tampoco no es un error, es solo un warning, perdon. En todo caso que errores de compilación hay??
Buscare por el google algo sobre la terecera opcion que me has puesto a ver si me sirve de ayuda.

Un saludo y gracias.