Actualizar / Insertar disparador en SQL Server

Soy nuevo en SQL Server y disparadores. Quiero crear un activador que se active cuando se inserten filas nuevas o se actualicen filas existentes. El activador actualizará un conjunto de columnas calculadas.

¿Puede alguien darme un activador básico que verifique si fldType = 'INVALID', si lo es, establece otra columna errInvalid a 1.

Tenga en cuenta que se insertarán 5000 filas (en una sola visita) por día, por lo que el rendimiento es un problema. He buscado en otro lado, pero me estoy confundiendo.

OK, mi pregunta ha evolucionado. He conducido por la ruta Persisted Colums. He creado un campo persistente básico exitoso, pero tengo problemas con una lógica anidada pf.

¿Puedo (y cómo) hacer lo siguiente?

caso cuando [MissCustName] ES verdadero entonces cuando [CustomerAccountName] ES NULL entonces (1) else (0) end else (0) end

preguntado el 12 de junio de 12 a las 16:06

Creo que estás confundido con lo que es una "columna calculada". Si fuera una columna calculada, entonces no necesitaría actualizarla, sería automático sin la necesidad de un disparador. De hecho, parece que esta podría ser la mejor opción para ti:

¿Ya probaste algo? Si es así, publícalo aquí. -

Puedo imaginar a alguien abriendo archivos de SO en 20 años y luego diciendo "En 2012, insertar 5000 filas por día en una base de datos era un problema grave" ;-) -

5 Respuestas

Tal vez una mejor opción sería usar columnas calculadas en su lugar.

create table myTab
(
    fieldType varchar(10),
    errInvalid As Case When fieldType = 'INVALID' then 1 else 0 end PERSISTED
)
Go
insert into mytab(fieldType) values ('aaa')
insert into mytab(fieldType) values ('INVALID')
Go
Select * from mytab

Respondido el 12 de junio de 12 a las 16:06

Consideré campos calculados, pero algunos necesitaría realizar algún tipo de búsqueda y no quiero tener un impacto en el rendimiento, así que pensé que era mejor tener campos estáticos que solo se cambian cuando ACTUALIZO o INSERTO. - aSystemOverload

La palabra clave "PERSISTENTE" es justo lo que necesita. Si es "Persistente", se calcula al insertar/actualizar. - Janis

OK, mi pregunta ha evolucionado. He conducido por la ruta de las Columnas Persistentes. Creé un campo persistente básico exitoso, pero tengo problemas con una lógica anidada pf. ¿Puedo (y cómo) hacer lo siguiente: caso cuando [MissCustName] ES verdadero entonces cuando [CustomerAccountName] ES NULL entonces (1) else (0) end else (0) end - aSystemOverload

Case When fieldType = 'INVALID' luego 1 else Case When otherField = 'value' then 2 else 0 end end /// como cualquier declaración de caso.. - Janis

GRRRR, creo que tiene problemas para hacer referencia a otro campo persistente. ¿Calcula los campos persistentes en orden? - aSystemOverload

Podrías usar algo como esto:

CREATE TRIGGER dbo.trgInsertUpdate
ON dbo.YourTableNameHere
FOR INSERT, UPDATE 
AS BEGIN
   -- update the column
   UPDATE dbo.YourTableNameHere
   SET errInvalid = 1
   FROM Inserted i 
   WHERE 
      dbo.YourTableNameHere.ID = i.ID   -- establish link to "Inserted" pseudo-table
      AND fldType = 'INVALID'
END

Básicamente, el gatillo se llama una vez para cada declaración, por lo que podría aplicarse a varias filas a la vez. Esas filas y sus nuevos valores se almacenan en el Inserted pseudo-tabla, que contiene todas las columnas de su tabla.

Necesita encontrar esas filas en su tabla donde fldType = 'INVALID', y que también forman parte del Inserted pseudo tabla (aquellas que fueron insertadas o actualizadas).

Respondido el 12 de junio de 12 a las 16:06

@Bridge: sí, lo siento, escribo demasiado rápido :-) ¡Gracias! Actualizado. - marc_s

+1 Fingiré que no me di cuenta de las otras 3 ediciones también. Desacelerar ;-) - Puente

Creo que esto hará lo que quieras:

CREATE TRIGGER Trigger1
ON Table1
FOR INSERT, UPDATE
AS
    UPDATE t
    SET    errInvalid = 1
    FROM   Table1 t
           INNER JOIN Inserted i
             ON i.id = t.id
    WHERE  t.fldType = 'INVALID'

Respondido el 12 de junio de 12 a las 16:06

Realmente quieres una columna calculada. Funcionará mejor. Ver este Publicación SO.

CREATE TABLE [dbo].[myTab]
(
  [fldType] [varchar](50) NULL ,
  [errInvalid] AS ( CASE [fldType]
                      WHEN 'Invalid' THEN ( 1 )
                      ELSE ( 0 )
                    END )
) 

contestado el 23 de mayo de 17 a las 13:05

¿Por qué no usar una columna calculada "real"?

p.ej:

CREATE TABLE foobar
(
    fldType varchar(10),
    errInvalid AS CASE WHEN fldType = 'INVALID' THEN 1 ELSE 0 END
)

El uso de una columna calculada persistente probablemente aumentaría el rendimiento si realiza muchas lecturas (prácticamente al nivel de las columnas "físicas"). Solo agrega PERSISTED después de la definición de la columna:

CREATE TABLE foobar
(
    fldType varchar(10),
    errInvalid AS CASE WHEN fldType = 'INVALID' THEN 1 ELSE 0 END PERSISTED
)

Respondido el 12 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.