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

insertar un registro en una tabla cuando se coloque un valor "x" en el campo de otra

Estas en el tema de insertar un registro en una tabla cuando se coloque un valor "x" en el campo de otra en el foro de Bases de Datos General en Foros del Web. Dejeme explicarles que es lo que necesito hacer y la verdad no supe ni como buscarlo !!! Digamos que tengo 3 tablas tabla1 , tabla2 ...
  #1 (permalink)  
Antiguo 16/05/2003, 11:44
Avatar de fenix4  
Fecha de Ingreso: noviembre-2001
Ubicación: Caracas
Mensajes: 226
Antigüedad: 22 años, 5 meses
Puntos: 1
Pregunta insertar un registro en una tabla cuando se coloque un valor "x" en el campo de otra

Dejeme explicarles que es lo que necesito hacer y la verdad no supe ni como buscarlo !!!

Digamos que tengo 3 tablas tabla1 , tabla2 y tabla2_tmp . Lo que necesito hacer es colocar registros de tabla1 en tabla2 , pero solo cuando en el campo situacion de tabla1 sea = 2 por decir algo, osea que si introduzco el registro y ese campo situacion tiene 1
no pasa a la otra tabla, pero cuando cambie el valor a 2 creara un registro nuevo en la tabla2_tmp (quise crear una tabla temporal para trabajar mejor y luego pasar cada cieto tiempo todos los registros a tabla2 ) se que tengo que trabajar con los disparadores pero no se exactamente como ...
__________________
S.L.P.S.
  #2 (permalink)  
Antiguo 16/05/2003, 20:26
Avatar de Mickel  
Fecha de Ingreso: mayo-2002
Ubicación: Lima, Peru
Mensajes: 4.619
Antigüedad: 22 años
Puntos: 7
ayudaria si dice que base de datos estas usando...
__________________
No tengo firma ahora... :(
  #3 (permalink)  
Antiguo 19/05/2003, 09:57
Avatar de fenix4  
Fecha de Ingreso: noviembre-2001
Ubicación: Caracas
Mensajes: 226
Antigüedad: 22 años, 5 meses
Puntos: 1
disculpen!!!
SQL 2000
__________________
S.L.P.S.
  #4 (permalink)  
Antiguo 19/05/2003, 10:19
 
Fecha de Ingreso: enero-2002
Ubicación: Zaragoza
Mensajes: 144
Antigüedad: 22 años, 3 meses
Puntos: 0
Te mando la sintaxis para crear un trigger:
CREATE TRIGGER (T-SQL)
Crea un desencadenador, que es una clase especial de procedimiento almacenado que se ejecuta automáticamente cuando un usuario intenta la instrucción especificada de modificación de datos en la tabla indicada. Microsoft® SQL Server™ permite la creación de varios desencadenadores para cualquier instrucción INSERT, UPDATE o DELETE dada.

Sintaxis
CREATE TRIGGER nombreDesencadenador
ON tabla
[WITH ENCRYPTION]
{
{FOR { [DELETE] [,] [INSERT] [,] [UPDATE] }
[WITH APPEND]
[NOT FOR REPLICATION]
AS
instrucciónSQL [...n]

}
|
{FOR { [INSERT] [,] [UPDATE] }
[WITH APPEND]
[NOT FOR REPLICATION]
AS
{ IF UPDATE (columna)
[{AND | OR} UPDATE (columna)]
[...n]
| IF (COLUMNS_UPDATED() {operadorNivelBit} máscaraBitsActualizada)
{ operadorComparación} máscaraBitsColumna [...n]
}
instrucciónSQL [...n]

}
}

Argumentos
nombreDesencadenador
Es el nombre del desencadenador. Un nombre de desencadenador debe cumplir las reglas de los identificadores y debe ser único en la base de datos. Especificar el nombre del propietario del desencadenador es opcional.
tabla
Es la tabla en que se ejecuta el desencadenador; algunas veces se llama la tabla del desencadenador. Especificar el nombre del propietario de la tabla es opcional. No se pueden especificar vistas.
WITH ENCRYPTION
Codifica las entradas syscomments que contienen el texto de CREATE TRIGGER.
{ [DELETE] [,] [INSERT] [,] [UPDATE] } | { [INSERT] [,] [UPDATE]}
Son palabras clave que especifican qué instrucciones de modificación de datos activan el desencadenador cuando se intentan contra esta tabla. Se debe especificar al menos una opción. En la definición del desencadenador se permite cualquier combinación de éstas. Si especifica más de una opción, sepárelas con comas.
WITH APPEND
Especifica que debe agregarse un desencadenador adicional de un tipo existente. El uso de esta cláusula opcional sólo es necesario cuando el nivel de compatibilidad sea menor o igual que 65. Si el nivel de compatibilidad es mayor o igual que 70, la cláusula opcional WITH APPEND no es necesaria para agregar un desencadenador adicional de un tipo existente (éste es el comportamiento predeterminado de CREATE TRIGGER con el valor de nivel de compatibilidad mayor o igual que 70). Para obtener más información, consulte sp_dbcmptlevel.
NOT FOR REPLICATION
Indica que el desencadenador no debe ejecutarse cuando un proceso de duplicación modifica la tabla involucrada en el mismo.
AS
Son las acciones que va a llevar a cabo el desencadenador.
instrucciónSQL
Son las condiciones y acciones del desencadenador. Las condiciones del desencadenador especifican los criterios adicionales que determinan si los intentos de las instrucciones DELETE, INSERT o UPDATE hacen que se lleven a cabo las acciones del desencadenador.
Las acciones del desencadenador especificadas en las instrucciones Transact-SQL entran en efecto cuando se intenta la acción del usuario (DELETE, INSERT o UPDATE).

Los desencadenadores pueden incluir cualquier número y clase de instrucciones Transact-SQL excepto SELECT. Un desencadenador está diseñado para comprobar o cambiar los datos en base a una instrucción de modificación de datos; no debe devolver datos al usuario. Las instrucciones Transact-SQL de un desencadenador incluyen a menudo lenguaje de control de flujo. En las instrucciones CREATE TRIGGER se utilizan unas cuantas tablas especiales:

deleted e inserted son tablas lógicas (conceptuales). Son de estructura similar a la tabla en que se define el desencadenador (es decir, la tabla en que se intenta la acción del usuario) y mantiene los valores antiguos o nuevos de las filas que la acción del usuario puede cambiar. Por ejemplo, para recuperar todos los valores de la tabla deleted, utilice:
SELECT *

FROM deleted


En un desencadenador DELETE, INSERT o UPDATE, SQL Server no admite referencias de columnas text, ntext o image en las tablas inserted y deleted si el nivel de compatibilidad es igual a 70. No se puede tener acceso a los valores text, ntext e image de las tablas inserted y deleted. Para recuperar el nuevo valor de un desencadenador INSERT o UPDATE, combine la tabla inserted con la tabla de actualización original. Cuando el nivel de compatibilidad es 65 o inferior, se devuelven valores Null para las columnas inserted o deleted text, ntext o image que admiten valores Null; si las columnas no permiten valores Null, se devuelven cadenas de longitud cero.
n
Se trata de un marcador de posición que indica que se pueden incluir varias instrucciones Transact-SQL en el desencadenador. Para la instrucción IF UPDATE (columna), se pueden incluir varias columnas al repetir la cláusula UPDATE (columna).
IF UPDATE (columna)
Prueba una acción INSERT o UPDATE en una columna especificada y no se utiliza con operaciones DELETE. Se puede especificar más de una columna. Como el nombre de la tabla se especifica en la cláusula ON, no lo incluya antes del nombre de la columna en una cláusula IF UPDATE. Para probar una acción INSERT o UPDATE para más de una columna, especifique una cláusula UPDATE(columna) separada a continuación de la primera.
--------------------------------------------------------------------------------

Nota La cláusula IF UPDATE (columna) funciona de forma idéntica a una instrucción IF, IF…ELSE o WHILE, y puede utilizar el bloque BEGIN…END. Para obtener más información, consulte Lenguaje de control de flujo.


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

UPDATE(columna) puede utilizarse en cualquier parte dentro del cuerpo del desencadenador.

columna
Es el nombre de la columna que se va a probar para una acción INSERT o UPDATE. Esta columna puede ser de cualquier tipo de datos admitido por SQL Server. Para obtener más información, consulte Tipos de datos.
IF (COLUMNS_UPDATED())
Prueba, sólo en un desencadenador INSERT o UPDATE, si la columna o columnas mencionadas se insertan o se actualizan. COLUMNS_UPDATED devuelve un patrón de bits varbinary que indica qué columnas de la tabla se insertaron o se actualizaron.
COLUMNS_UPDATED puede utilizarse en cualquier parte dentro del cuerpo del desencadenador.

operadorNivelBit
Es el operador de bits que se utilizará en las comparaciones.
máscaraBitsActualizada
Es la máscara de bits de enteros de las columnas realmente actualizadas o insertadas. Por ejemplo, la tabla t1 contiene las columnas C1, C2, C3, C4 y C5. Para comprobar si las columnas C2, C3 y C4 se han actualizado (con un desencadenador UPDATE en la tabla t1), especifique un valor de 14. Para comprobar si sólo se ha actualizado la columna C2, especifique un valor de 2.
operadorComparación
Es el operador de comparación. Utilice el signo igual (=) para comprobar si todas las columnas especificadas en máscaraBitsActualizada se han actualizado. Utilice el símbolo mayor que (>) para comprobar si alguna de las columnas especificadas en máscaraBitsActualizada se han actualizado.
máscaraBitsColumna
Es la máscara de bits de enteros de las columnas que hay que comprobar para ver si se han actualizado o insertado.

Nota: Este texto está sacado de la ayuda de SQL SERVER.
  #5 (permalink)  
Antiguo 20/05/2003, 09:25
Avatar de fenix4  
Fecha de Ingreso: noviembre-2001
Ubicación: Caracas
Mensajes: 226
Antigüedad: 22 años, 5 meses
Puntos: 1
hola y gracias
asqui les mando en codigo que hice pero tengo un detalle
Código:
CREATE TRIGGER export_dir2 ON [dbo].[prog_acreditados_tmp] 
INSTEAD OF  UPDATE 
AS
declare @situacion int
declare @situacion_ins int
declare @nro_exp int
declare @nro_exp_ins int
select @situacion_ins = situacion, @nro_exp_ins = nro_exp from inserted
select @situacion = situacion, @nro_exp = nro_exp from dbo.prog_acreditados_tmp where nro_exp = @nro_exp_ins
begin
if (@situacion_ins <> @situacion)
	begin		
	if ((@situacion_ins = 17) or (@situacion_ins = 168) )
		begin
		if (select id from dbo.directorio_tmp where nro_exp = @nro_exp and tipo_exp = 90) is null
		begin   
		insert into dbo.directorio_tmp	(
				nivel,
				programa,
				mencion,
				areaconocimiento,
				grado,
				sede,
				instituto,
				nro_exp,
				tipo_exp
				) 
				SELECT
				nivel,
				LOWER(nombre),
				LOWER(mencion),
				area_conocimiento,
				grado,
				LOWER(sede),				
				institucion,
				nro_exp,
				'90' 
				from dbo.prog_acreditados_tmp 
				where nro_exp = @nro_exp    
--		raiserror('Situacion de dir_tmp %d de exp %d y situacion de inseted %d de exp %d',16,1,@situacion,@nro_exp,@situacion_ins,@nro_exp_ins) 
		end
		end
	end
commit
end
este codigo funciona perfectamente, cuando hago un cambio en la tabla, especificamente en un campo lo compara con el valor que tenia anteriormente, el cual esta guardado temporalmente en la tabla inserted, si ese valor no esta en la tabla donde lo voy a introducir lo inserta alli.

El problema que tengo es que ahora en la tabla donde esta el trigger no guarda las modificaciones que le hago sea el campo que sea :( esto se debe al que estoy usando el INSTEAD OF en vez de AFTER, pero es que no se me ocurre de otra forma.

Gracias a todos

bingo !!! cambie la estrategia!!!

consegui una funcion que me dice si se realizo una modificacion al campo y luego lo comparo con el valor que necesito!!!
asi que lo hice con AFTER aqui les dejo el codigo y tambien el FAQ
Código:
CREATE TRIGGER export_dir ON [dbo].[prog_acreditados_tmp] 
AFTER UPDATE 
AS
declare @situacion int
declare @nro_exp int
select @situacion = situacion, @nro_exp = nro_exp from inserted --revisa en la tabla inserted los valores de los campos
begin
IF UPDATE (situacion)	-- verifica si se modifico el campo situacion
	begin		
	if ((@situacion = 17) or (@situacion = 168) ) -- verifica si es informe favorable o si es acreditado
		begin
		if (select id from dbo.directorio_tmp where nro_exp = @nro_exp and tipo_exp = 90) is null --revisa en la tabla a ver si ya esta el registro
			begin   
			insert into dbo.directorio_tmp	(
					nivel,
					programa,
					mencion,
					areaconocimiento,
					grado,
					sede,
					instituto,
					nro_exp,
					tipo_exp
					) 
					SELECT
					nivel,
					LOWER(nombre),
					LOWER(mencion),
					area_conocimiento,
					grado,
					LOWER(sede),				
					institucion,
					nro_exp,
					'90' 
					from dbo.prog_acreditados_tmp 
					where nro_exp = @nro_exp    			
			end
		end
	end	
--raiserror('Situacion de dir_tmp %d de exp %d ',16,1,@situacion,@nro_exp) -- para verificar los valores
end
__________________
S.L.P.S.

Última edición por fenix4; 20/05/2003 a las 09:25
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 17:07.