Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[Aporte][Gestión de Datos][Final] 07/02/2017
Autor Mensaje
pablit Sin conexión
Presidente del CEIT
Tortuga marítima
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.087
Agradecimientos dados: 325
Agradecimientos: 1.506 en 147 posts
Registro en: Apr 2010
Mensaje: #16
RE: [Aporte][Gestión de Datos][Final] 07/02/2017
(12-02-2018 19:43)CarooLina escribió:  Cuando lo puse no pense en el motor, pense que siempre hablaban de sql server
Yo tambien vi lo que probaron y lo probe por mi cuenta

GRacias!

(12-02-2018 16:02)DaWy escribió:  
(08-02-2017 17:59)lianndt escribió:  La solucion de Martin es mas performante creo yo, porque no tenes subselects y aprovechas el join directamente.

En cuanto al trigger yo haria algo asi:

CREATE TRIGGER Trig_Usuario ON Usuario
INSTEAD OF DELETE

AS
BEGIN

DELETE FROM Ingresos i INNER JOIN deleted d ON d.UsuarioID = i.UsuarioID
DELETE FROM Usuario u INNER JOIN deleted d ON u.UsuarioID = d.UsuarioID


Entonces ahi te aseguras de barrer primero todos los FK antes de volar los PK. Otra seria tirando algun IF, pero no hace falta porque el primer delete no tira error si es que el usuario no tiene ingresos, no borra nada y listo.


creeeo que seria asi , despues lo pruebo.

Yo lo hice de esta manera, lo probe y funciono:


CREATE TRIGGER borrar_usuarios ON Usuarios INSTEAD OF DELETE
AS
BEGIN
DELETE FROM Ingresos WHERE IdUsuario IN (SELECT IdUsuario FROM deleted)
DELETE FROM Usuarios WHERE IdUsuario IN (SELECT IdUsuario FROM deleted)
END


De esta manera admite un borrado masivo no ?

Me parece que no, no admite un borrado masivo.

O sea, si voy borrando una por una, no habría problema con ése código... pero si hago un borrado masivo, el trigger actúa sólo para el primer elemento (a los demás no le va a dar bola).


Con cursores me aseguro que el trigger actúa sobre todos los elementos que quiera borrar

Sería algo así la solución usando cursores:


CREATE TRIGGER t_3b ON familiares
INSTEAD OF DELETE
AS
BEGIN
DECLARE @idUsuario INT
DECLARE cursor_3b CURSOR FOR SELECT idUsuario FROM deleted
OPEN cursor_3b
FETCH NEXT FROM cursor_3b INTO @idUsuario
WHILE @@FETCH_STATUS == 0
BEGIN
IF EXISTS(SELECT * FROM ingresos i WHERE i.idUsuario = @idUsuario)
BEGIN
DELETE FROM ingresos WHERE idUsuario = @idUsuario
END
DELETE FROM usuarios WHERE idUsuario = @idUsuario
FETCH NEXT FROM cursor_3b INTO @idUsuario
END
CLOSE cursor_3b
DEALLOCATE cursor_3b
END


Viva Perón.
(Este mensaje fue modificado por última vez en: 24-09-2019 02:45 por pablit.)
24-09-2019 02:39
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Mauro_bilo Sin conexión
Campeon del cubo Rubik
Tool
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 123
Agradecimientos dados: 139
Agradecimientos: 46 en 23 posts
Registro en: Sep 2010
BlogSpot Facebook LinkedIn
Mensaje: #17
RE: [Aporte][Gestión de Datos][Final] 07/02/2017


CREATE TABLE Usuario (
IdUsuario INT PRIMARY KEY NOT NULL,
Nombre CHAR(50) NOT NULL,
Apellido CHAR(50) NOT NULL,
FechaAlta date
)

CREATE TABLE Ingreso(
IdUsuario INT FOREIGN KEY REFERENCES Usuario(IdUsuario),
FechaIngreso DATE
)

INSERT INTO Usuario VALUES (1, 'Zlatan', 'Ibrahimovic', CAST('01/10/2018' AS DATE))
INSERT INTO Usuario VALUES (2, 'Lionel', 'Messi', CAST('02/01/2020' AS DATE))
INSERT INTO Usuario VALUES (3, 'Cristiano', 'Ronaldo', CAST('01/01/2020' AS DATE))

INSERT INTO Ingreso VALUES (1, CAST('02/16/2019' AS DATE))
INSERT INTO Ingreso VALUES (1, CAST('02/17/2019' AS DATE))
INSERT INTO Ingreso VALUES (1, CAST('02/18/2019' AS DATE))
INSERT INTO Ingreso VALUES (1, CAST('02/20/2019' AS DATE))
INSERT INTO Ingreso VALUES (1, CAST('02/21/2019' AS DATE))
INSERT INTO Ingreso VALUES (2, CAST('02/20/2019' AS DATE))

alter VIEW vw_final (Nombre, Apellido, UltimoIngreso)
AS
SELECT U.Nombre, U.Apellido, ISNULL(MAX(I.FechaIngreso), MIN(U.FechaAlta)) AS FechaIngreso
FROM Usuario U
LEFT JOIN Ingreso I ON U.IdUsuario = I.IdUsuario
GROUP BY U.IdUsuario, U.Nombre, U.Apellido

SELECT * FROM vw_final

(Este mensaje fue modificado por última vez en: 18-02-2020 15:57 por Mauro_bilo.)
18-02-2020 15:44
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)