SQL - Ayuda T-SQL, Mantener integridad referencial con trigger

 
Vista:
sin imagen de perfil
Val: 10
Ha aumentado su posición en 4 puestos en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL, Mantener integridad referencial con trigger

Publicado por william (5 intervenciones) el 01/10/2020 14:24:12
Hola, buen día, estoy haciendo un disparador (trigger) con T-SQL (SQL Server 2017) para mantener la integridad referencial entre dos tablas, debido a que ambas tablas tienen un cliclo en sus claves externas, por lo que he decidido hacer con trigger el equivalente a la integridad referencial a la hora de insertar, modificar y eliminar los datos de una tabla. las tablas son las siguientes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
create table Alojamiento(
	nombre varchar(30) not null primary key,
	direccion varchar(40) not null,
	telefono varchar(20) not null,
	cant_habit int,
	contacto int
);
 
create table Personal(
	codigo int identity(1,1) not null primary key,
	nombre varchar(30) not null,
	direccion varchar(40) not null,
	nif varchar(10) unique not null check (nif like '[0-9][a-z][A-Z]'),
	nombre_alojam varchar(30) not null
);
 
alter table Alojamiento
  add foreign key(contacto) references Personal(codigo)
     on delete set null
     on update cascade;


El trigger que estoy realizando es el siguiente:

1
2
3
4
5
6
7
8
9
create TRIGGER ModificarEnCascada ON  Alojamiento
for UPDATE
AS
BEGIN
    update Personal
    set nombre_alojam=(select nombre from inserted)
    where nombre_alojam=(select nombre from deleted)
END
GO

Sucede que cuando intento modificar el campo 'nombre' en la tabla Alojamiento, con el objetivo de que se dispare el trigger y me modifique todas las filas en la tabla personal, me sale el siguiente error:

-----------------------------------

No se actualizó ninguna fila

Los datos de la fila 1 no se confirmaron.
Origen del error: .Net SQL Client Data Provider.
Mensaje de error: La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
Se terminó la instrucción.

-----------------------------------

He intentado modificar el código de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create TRIGGER ModificarEnCascada ON  Alojamiento
for UPDATE
AS
BEGIN
    declare @i varchar(30);
    declare @d varchar(30);
 
    select @i=nombre from inserted;
    select @d=nombre from deleted;
 
    update Personal
    set nombre_alojam=@i;
    where nombre_alojam=@d;
END
GO


Con el mismo mensaje de error. Alguien me puede ayudar, no logro encontrar el error.

Saludos y buen día a todos

William
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 143
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL, Mantener integridad referencial con trigger

Publicado por Francisco (49 intervenciones) el 01/10/2020 19:53:47
Hola

Pues entiendase que o usas ON UPDATE ON DELETE y dejas que SQL Server haga el resto o lo programas tu via TRIGGERS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Create table [Alojamiento]
(
	[nombre] Varchar(30) NOT NULL,
	[direccion] Varchar(40) NULL,
	[telefono] Varchar(20) NULL,
	[cant_habit] Integer NULL,
	[contacto] Integer NULL,
Constraint [pk_Alojamiento] Primary Key ([nombre])
)
go
 
Create table [Personal]
(
	[codigo] Integer Identity(1,1) NOT NULL,
	[nombre] Varchar(20) NOT NULL,
	[direccion] Varchar(40) NOT NULL,
	[nif] Varchar(10) NOT NULL Check (nif LIKE '[0-9][a-z][A-Z]'), UNIQUE ([nif]),
	[nombre_alojam] Varchar(30) NOT NULL,
Constraint [pk_Personal] Primary Key ([codigo])
)
go
 
Set quoted_identifier on
go
 
/* Update trigger "tu_Personal" for table "Personal" */
Create trigger [tu_Personal]
on [Personal] after update as
begin
	declare @numrows int
	select @numrows = @@rowcount
	if @numrows = 0
		return
 
	/* Cascade child "Alojamiento" update when parent "Personal" updated */
 	if update([codigo])
 	begin
 		update [Alojamiento]
 		set 	[contacto] = i.[codigo]
 		from [Alojamiento] t, inserted i, deleted d
 		where 	t.[contacto] = d.[codigo]
 		and	(i.[codigo] != d.[codigo])
 	end
end
go
 
 
/* Delete trigger "td_Personal" for table "Personal" */
Create trigger [td_Personal]
on [Personal] after delete as
begin
	declare @numrows int
	select @numrows = @@rowcount
	if @numrows = 0
		return
 
	/* Cascade setnull child "Alojamiento" when parent "Personal" deleted */
  	update [Alojamiento]
 	set 	[contacto] = NULL
 	from [Alojamiento] t, deleted d
 	where 	t.[contacto] = d.[codigo]
 
end
go
 
Set quoted_identifier off
go

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.679
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL, Mantener integridad referencial con trigger

Publicado por Isaias (1588 intervenciones) el 01/10/2020 21:34:47
¿Estas tratando de inventar el "hilo negro"?, SQL Server por si solo, cuida el DRI con los CONSTRAINS, en realidad, ¿Qué buscas con tu codigo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Francisco
Val: 143
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL, Mantener integridad referencial con trigger

Publicado por Francisco (49 intervenciones) el 02/10/2020 17:16:56
LA integridad referncial que es el origen de este hilo

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 2.679
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL, Mantener integridad referencial con trigger

Publicado por Isaias (1588 intervenciones) el 04/10/2020 17:48:04
Pero SQL SERVER ya lo hace !!!, si yo defino mi modelo con DRI, esta, se crea con las llaves PRIMARY KEY, FOREING KEY y los CONSTRAINS, por eso hice el comentario de "inventar el hilo negro"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar