Duda Urgente Trigger AFTER INSERT

14/06/2013 - 20:57 por rcastillo | Informe spam
Hola , Buenos días / buenas tardes Comunidad.
Con el gusto de Saludarlos Vengo a pedir su ayuda Urgentemente
Les comento.

Estoy realizando un trigger para 4 tablas las cuales son

tb_reconocimiento
tb_perfil
tb_tipo_reconocimiento
tb_reconocimiento_sucursal

Les explico, el trigger debe hacer un Insert Luego de que se aya Insertado un reconocimiento en la Tabla "TB_RECONOCIMIENTO_SUCURSAL" , se debe insertar en la tabla "TB_RECONOCIMIENTO" de la tabla tb_reconocimiento_sucursal extraigo tres datos

1-@sucursal VARCHAR(100)
2-@id_reconocimiento INT
3-@f_creacion DATE

y lo que necesito hacer es que cuando ocurra esto, en la tabla "TB_RECONOCIMIENTO" se inserte el reconocimiento que se inserto en la tabla "TB_RECONOCIMIENTO_SUCURSAL" para todos los perfiles de la tabla "TB_PERFIL" que tenga la sucursal igual a la sucursal que se le ingreso el reconocimiento.

mi problema cae en que no puedo obtener el id de los perfiles , entonces cuando hace la insercion me dice que el perfil_id va NULL
y no encuentro la manera de poder obtenerlo.

LES DEJO ACA EL TRIGGER QUE AHSTA AHORA TENGO REALIZADO

CREATE TRIGGER trgsucursal ON tb_reconocimiento_sucursal

AFTER INSERT

AS
DECLARE

@sucursal AS VARCHAR,
@reco_id AS INT,
@f_creacion AS DATE

SELECT @reco_id= reconocimiento_id,
@sucursal = sucursal,
@f_creacion = f_creacion
FROM inserted

DECLARE
@id_perfil AS INT

SELECT @id_perfil = tp.id FROM tb_perfil tp WHERE tp.sucursal = @sucursal

SELECT tp.id FROM tb_perfil tp inner join
tb_reconocimiento tb ON tb.perfil_id = tp.id INNER JOIN
tb_tipo_reconocimiento ttr ON ttr.id = @reco_id INNER JOIN
tb_reconocimiento_sucursal trs ON trs.sucursal = @sucursal

BEGIN

INSERT INTO tb_reconocimiento (perfil_id,reconocimiento_id,f_creacion)
VALUES(@id_perfil,@reco_id,@f_creacion)

END
GO


espero me puedan ayudar, de antemano muchas gracias a todos los que me puedan colaborar con algo de sus conocimientos.

bueno y aqui les dejo el diseño de las tablas

Tablas

CREATE TABLE [dbo].[tb_perfil](
[id] [int] IDENTITY(1,1) NOT NULL,
[nombre] [varchar](250) NOT NULL,
[apellidos] [varchar](250) NOT NULL,
[email] [varchar](250) NOT NULL,
[sucursal] [varchar](250) NOT NULL,
[login] [varchar](10) NOT NULL,
[password] [varchar](250) NOT NULL,
[interes] [varchar](500) NOT NULL,
[f_nacimiento] [datetime] NOT NULL,
[tipoperfil_id] [int] NOT NULL,
[f_creacion] [datetime] NOT NULL,
[privado] [bit] NOT NULL,
[activo] [bit] NOT NULL,
CONSTRAINT [PK_tb_perfil] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

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


CREATE TABLE [dbo].[tb_reconocimiento](
[id] [int] IDENTITY(1,1) NOT NULL,
[perfil_id] [int] NOT NULL,
[reconocimiento_id] [int] NOT NULL,
[f_creacion] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

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


CREATE TABLE [dbo].[tb_reconocimiento_sucursal](
[id] [int] IDENTITY(1,1) NOT NULL,
[sucursal] [varchar](500) NOT NULL,
[reconocimiento_id] [int] NOT NULL,
[f_creacion] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

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

CREATE TABLE [dbo].[tb_tipo_reconocimiento](
[id] [int] IDENTITY(1,1) NOT NULL,
[descripcion] [varchar](6000) NOT NULL,
[img] [varchar](250) NOT NULL,
[nombre] [varchar](150) NOT NULL,
[f_creacion] [datetime] NOT NULL,
CONSTRAINT [PK__tb_tipo___3213E83F07EC11B9] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
 

Leer las respuestas

#1 rcastillo
14/06/2013 - 23:13 | Informe spam
rcastillo escribió el 14/06/2013 20:57 :
Hola , Buenos días / buenas tardes Comunidad.
Con el gusto de Saludarlos Vengo a pedir su ayuda Urgentemente
Les comento.

Estoy realizando un trigger para 4 tablas las cuales son

tb_reconocimiento
tb_perfil
tb_tipo_reconocimiento
tb_reconocimiento_sucursal

Les explico, el trigger debe hacer un Insert Luego de que se aya Insertado un
reconocimiento en la Tabla "TB_RECONOCIMIENTO_SUCURSAL" , se debe
insertar en la tabla "TB_RECONOCIMIENTO" de la tabla
tb_reconocimiento_sucursal extraigo tres datos

VARCHAR(100)
INT
DATE

y lo que necesito hacer es que cuando ocurra esto, en la tabla
"TB_RECONOCIMIENTO" se inserte el reconocimiento que se inserto en la
tabla "TB_RECONOCIMIENTO_SUCURSAL" para todos los perfiles de la
tabla "TB_PERFIL" que tenga la sucursal igual a la sucursal que se le
ingreso el reconocimiento.

mi problema cae en que no puedo obtener el id de los perfiles , entonces cuando
hace la insercion me dice que el perfil_id va NULL
y no encuentro la manera de poder obtenerlo.

LES DEJO ACA EL TRIGGER QUE AHSTA AHORA TENGO REALIZADO

CREATE TRIGGER trgsucursal ON tb_reconocimiento_sucursal

AFTER INSERT

AS
DECLARE

@sucursal AS VARCHAR,
@reco_id AS INT,
@f_creacion AS DATE

SELECT @reco_id= reconocimiento_id,
@sucursal = sucursal,
@f_creacion = f_creacion
FROM inserted

DECLARE
@id_perfil AS INT

SELECT @id_perfil = tp.id FROM tb_perfil tp WHERE tp.sucursal = @sucursal

SELECT tp.id FROM tb_perfil tp inner join
tb_reconocimiento tb ON tb.perfil_id = tp.id INNER JOIN
tb_tipo_reconocimiento ttr ON ttr.id = @reco_id INNER JOIN
tb_reconocimiento_sucursal trs ON trs.sucursal = @sucursal

BEGIN

INSERT INTO tb_reconocimiento (perfil_id,reconocimiento_id,f_creacion)
VALUES(@id_perfil,@reco_id,@f_creacion)

END
GO


espero me puedan ayudar, de antemano muchas gracias a todos los que me puedan
colaborar con algo de sus conocimientos.

bueno y aqui les dejo el diseño de las tablas

Tablas

CREATE TABLE [dbo].[tb_perfil](
[id] [int] IDENTITY(1,1) NOT NULL,
[nombre] [varchar](250) NOT NULL,
[apellidos] [varchar](250) NOT NULL,
[email] [varchar](250) NOT NULL,
[sucursal] [varchar](250) NOT NULL,
[login] [varchar](10) NOT NULL,
[password] [varchar](250) NOT NULL,
[interes] [varchar](500) NOT NULL,
[f_nacimiento] [datetime] NOT NULL,
[tipoperfil_id] [int] NOT NULL,
[f_creacion] [datetime] NOT NULL,
[privado] [bit] NOT NULL,
[activo] [bit] NOT NULL,
CONSTRAINT [PK_tb_perfil] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

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


CREATE TABLE [dbo].[tb_reconocimiento](
[id] [int] IDENTITY(1,1) NOT NULL,
[perfil_id] [int] NOT NULL,
[reconocimiento_id] [int] NOT NULL,
[f_creacion] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

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


CREATE TABLE [dbo].[tb_reconocimiento_sucursal](
[id] [int] IDENTITY(1,1) NOT NULL,
[sucursal] [varchar](500) NOT NULL,
[reconocimiento_id] [int] NOT NULL,
[f_creacion] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

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

CREATE TABLE [dbo].[tb_tipo_reconocimiento](
[id] [int] IDENTITY(1,1) NOT NULL,
[descripcion] [varchar](6000) NOT NULL,
[img] [varchar](250) NOT NULL,
[nombre] [varchar](150) NOT NULL,
[f_creacion] [datetime] NOT NULL,
CONSTRAINT [PK__tb_tipo___3213E83F07EC11B9] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


Señores antes que me contesten esto ya logre cargar el dato que necesitaba , ahora estoy en otra duda quizas peor y es esta

Buenas señores eh estado peleando con los lindos triggers , y ya casi termino solo me queda una cosa mas , y es esto , NECESITO recorrer la variable a la que le asigne todos los ids de perfiles a los cuales les voy insertar después de haber insertado en la otra tabla , como lo puedo hacer , QUE NO SEA CON CURSORES, alguna otra manera ? si es posible una ayuda en esto por favor de antemano muchas gracias


LA Variable @perfil_id se llena con unos 5 registros , como puedo hacer que inserte 5 veces sin usar cursores es posible y como :O busco y no encuentro porfavor
hacii quedo por ahora


ALTER TRIGGER trgsucursal ON tb_reconocimiento_sucursal

AFTER INSERT

AS
DECLARE

@sucursal AS VARCHAR,
@reco_id AS INT,
@f_creacion AS DATE,
@id_perfil AS INT

SELECT @reco_id= reconocimiento_id,
@sucursal = sucursal,
@f_creacion = f_creacion
FROM inserted



select @id_perfil = tp.id from tb_perfil tp
join inserted
on inserted.sucursal= tp.sucursal
where tp.sucursal =inserted.sucursal

BEGIN

INSERT INTO tb_reconocimiento (perfil_id,reconocimiento_id,f_creacion)
VALUES(@id_perfil,@reco_id,@f_creacion)
END
go

Preguntas similares