1
resposta

Trigger para inserção de cod prod e data

Eu criei a seguinte situação problema, para todos produtos inseridos na tabela de produtos, eu quero que uma trigger faça a inserção do codigo e data em outra tabela. Acontece que, ao fazer isso ele insere todos os produtos sem exceção, eu quero fazer a inserção da quantidade exata de dados que foram inseridos..

Para isso, eu pensei em fazer uma busca dentro da tabela produtos e se não for encontrado nenhum produto com o código, ele faz a inserção. Entendo que pode ser muito custoso, pq ele vai consultar todos os dados toda vez que for inserido um registro.. O problema, é que não estou conseguindo desenrolar essa query

--tabela que receberá os últimos produtos inseridos (inserted)
CREATE TABLE LOG_PROD (
    COD_PROD VARCHAR(10) PRIMARY KEY,
    D_INSERIDO DATE
);
--TRIGGER que identifica a inserção dos ultimos produtos e insere na tabela log_prod

CREATE TRIGGER TG_LOG_PROD
ON [dbo].[TABELA DE PRODUTOS]
AFTER INSERT
AS
BEGIN
    INSERT INTO LOG_PROD (COD_PROD, D_INSERIDO)
    SELECT [CODIGO DO PRODUTO], GETDATE() FROM [dbo].[TABELA DE PRODUTOS]

END;

SELECT * FROM LOG_PROD

INSERT INTO [TABELA DE PRODUTOS]([CODIGO DO PRODUTO],[NOME DO PRODUTO] ,[EMBALAGEM],[TAMANHO],[SABOR],[PREÇO DE LISTA])
VALUES ('202015984','TEST','GRANDE','TST','MEDIO',2)

Abaixo, estou tentando fazer a big query, que vai consultar se há ou não o produto já inserido, para depois fazer a alteração dentro da trigger, mas, da erro;

-- 

 SELECT [CODIGO DO PRODUTO] FROM [TABELA DE PRODUTOS] AS TB2  WHERE TB2.[CODIGO DO PRODUTO] <> TB1.[COD_PROD]
 SELECT [COD_PROD] FROM LOG_PROD AS TB1

mensagem do erro; "Mensagem 4104, Nível 16, Estado 1, Linha 23 O identificador de várias partes "TB1.COD_PROD" não pôde ser associado."

1 resposta

Analisando seu problema, seria interessante fazer uma verificação na tabela de log se já existe o item através de um IF EXISTS para ser garantir uma consistência segue abaixo a reformulação do seu comando.

--tabela que receberá os últimos produtos inseridos (inserted) CREATE TABLE LOG_PROD ( COD_PROD VARCHAR(10) PRIMARY KEY, D_INSERIDO DATE ); --TRIGGER que identifica a inserção dos ultimos produtos e insere na tabela log_prod

CREATE TRIGGER TG_LOG_PROD ON [dbo].[TABELA DE PRODUTOS] AFTER INSERT AS

/########################################################## INSERT DE LOG DE NOVOS PRODUTOS ##########################################################/

 IF EXISTS  (    SELECT DISTINCT NEW.[CODIGO DO PRODUTO] FROM INSERTED NEW LEFT JOIN LOG_PROD          L  ON  L.COD_PROD   =  NEW.[CODIGO DO PRODUTO]
                 WHERE L.COD_PROD IS NULL    
       ) 

BEGIN INSERT INTO LOG_PROD (COD_PROD, D_INSERIDO) SELECT [CODIGO DO PRODUTO], GETDATE() FROM [dbo].[TABELA DE PRODUTOS]

END;

SELECT * FROM LOG_PROD

INSERT INTO [TABELA DE PRODUTOS]([CODIGO DO PRODUTO],[NOME DO PRODUTO] ,[EMBALAGEM],[TAMANHO],[SABOR],[PREÇO DE LISTA]) VALUES ('202015984','TEST','GRANDE','TST','MEDIO',2)