¿Un trigger recibe parámetros?

Hola no entiendo muy bien eso de los trigger pero quiero solucionar el problema que tengo usando trigger.
Bueno mi idea es la siguiente. Tengo una tabla de domicilios tiene un campo llamado consecutivo_domicilio esto porque un contacto puede tener más de un domicilio lo que quiero es que al momento de eliminar una tupla el consecutivo se recorra. Ejemplo fulanito tiene 2 domicilios si elimino el primer domicilio (consecutivo 1) quiero hacer que el domicilio 2 (con consecutivo 2) ahora cambie y sea el uno. ¿Pensaba hacerlo con untrigger pero mi problema es que no se si u n trigger reciba parámetros de entrada o no o estoy empleado mal mi lógica alguna forma más eficaz de realizar esto?
Gracias
1

1 respuesta

1
Respuesta de
Hola,
Te explicare de una manera entendible como es que funciona un trigger:
- Los trigger son disparadores que se activan cuando realizas operaciones de insert, update o delete
- No recibe parámetros.
- Lo más importante es que estos triggers tienen la información que se ha eliminado, actualizado, o insertado para que tu puedas realizar operaciones en base a ellas.
Por ejemplo
Yo tengo 2 tablas, una con empleado y otra con sus transacciones.
T_EMPLEADO (ID_EMPLEADO, .....)
T_TRANSACCIONES (....., ID_EMPLEADO, ....)
Mi lógica de negocio explica que cuando un eliminado es eliminado, entonces sus transacciones se eliminas (utópico pero lo hago por el ejemplo)
create trigger TRG_TRANSACCION_EMPREADO
on T_EMPLEADO --Aca indicamos la tabla que se vera validada
FOR DELETE ---aca decimos para que tipo de operacion se disparará
AS
       ---DOS COSAS:
      --Tabla inserted : contiene la información que se inserto o los registros nuevos actualizados
-- TABLA DELETED: REGISTROS QUE SE ELIMINARON O LOS DATOS ANTIGUOS ANTES DE LA ACTUALIZACION
    --borramos en T_TRANSACCION los ID_EMPLEADO que se encuentre en la tabla deleted de T_EMPLEADO que son los datos borrados de empleados
   delete from T_TRANSACCION
where id_empleado in (select id_empleado from deleted)
Bueno, en suma es así como funciona, espero te sirva y puedas aplicarlo en tu escenario.
Saludos.
Brownsea
Hola gracias me ha servido de mucho ya entendí la sintaxis ahora tengo otro problema (discúlpeme es que acabo de ingresar y soy nueva con esto de base de datos y programación ), mi trigger es así:
CREATE TRIGGER TR_ModConsecutivo
ON domicilios_empresa
for DELETE
AS
declare @consecutivo int
if exists (select * from domicilios_empresa e where e.cve_empresa=(select cve_empresa from deleted))
 set @consecutivo=(select max(consecutivo_domicilio) from domicilios_empresa e where e.cve_empresa=(select cve_empresa from deleted))-1
else
 set @consecutivo=1
update e set
consecutivo_domicilio=@consecutivo
from domicilios_empresa e inner join deleted d
on e.cve_empresa=d.cve_empresa
GO
cuando elimino una tupla a todos los domicilios correspondientes a esa empresa le pone lo mismo, no se como rescatar el valor anterior al q se elimino, o ya me bloque, o estoe s muy avanzado para mi... gracias y saludos
Hola,
¿Para darte una mejor ayuda puedes ponerme parte de tu tabla para entender tus datos?
Saludos
Brownsea
Claro esta es la tabla
/* Table: DOMICILIOS_EMPRESA                                   
create table DOMICILIOS_EMPRESA (
   CVE_DOMICILIO        int                  not null,
   CVE_EMPRESA          int                  not null,
   CVE_ESTADO           int                  null,
   CVE_CIUDAD           int                  null,
   CALLE                varchar(150)         null,
   NUMERO_EXTERIOR      varchar(10)          null,
   NUMERO_INTERIOR      varchar (10)         null,
   NUMERO_DEPTO         varchar(10)          null,
   COMENTARIO           varchar (100)        null,
   CONSECUTIVO_DOMICILIO int                  null
)
go
Bueno así esta conformada la tabla; cve_domicilio y cve_empresa son la llave primaria
el consecutivo solo es para indicar cuantos domicilios son de una empresa a lo que me refiero es que si una empresa tuviera 3 domicilios registrados (por ejemplo) y eliminara el primero que el campo consecutivo_domicilio se actualizara y ahora el 2do domicilio fuera el primero y así en caso de que hubiera más, pero solo para esa empresa, espero me pueda ayudar porque ya estoy desesperada, gracias de antemano
Hola,
Luego de revisar con más calma y entender tu problema te propongo la siguiente solución:
CREATE TRIGGER TR_ModConsecutivo
ON domicilios_empresa
for DELETE
AS
if exists (select * from domicilios_empresa e where e.cve_empresa=(select cve_empresa from deleted))
begin
    set @consecutivo=(select max(consecutivo_domicilio) from domicilios_empresa e where e.cve_empresa=(select cve_empresa from deleted))-1
    --aca haremos un cursor para cada una de los dominicilios, en el qry original actualizabas todos los datos de la empresa a 1 solo valor, y solo consideramos el caso que existan datos en la tabla
    declare @cve_domicilio int, @cve_empresa int, @count int
    set @count= 1
    DECLARE RS_VAR CURSOR FOR
         select cve_domicilio, cve_empresa from domicilios_empresa where cve_empresa in (select cve_empresa from deleted) order by consecutivo_domicilio
    OPEN RS_VAR
    FETCH NEXT FROM RS_VAR INTO  @cve_domicilio, @cve_empresa
    WHILE @@FETCH_STATUS=0
    BEGIN
         update  domicilios_empresa
        set    consecutivo_domicilio= @count
        where    cve_domicilio= @cve_domicilio and cve_empresa= @cve_empresa
        set     @count= @count+ 1
    FETCH NEXT FROM RS_VAR INTO @cve_domicilio, @cve_empresa
    END
    CLOSE RS_VAR
    DEALLOCATE RS_VAR
end
Espero te sirva, cualquier consulta me la haces saber. Suerte.
Saludos.
Brownsea
wauuu!
muchisiiimas gracias. Funciono perfectamente
Bueno de cursores a un no he visto nada, me tengo que aplicar para entender como funcionan, pero muchas muchas gracias
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje
¿No es la respuesta que estabas buscando? Puedes explorar otras preguntas del tema SQL Server o hacer tu propia pregunta: