SQLite EM VEZ DE Gatilhos

Resumo : neste tutorial você aprenderá sobre os INSTEAD OFtriggers SQLite e como criar um INSTEAD OFtrigger para inserir dados em tabelas base através de uma view.

O que são INSTEAD OFgatilhos no SQLite

No SQLite, um INSTEAD OF gatilho só pode ser criado com base em uma visualização, não em uma tabela.

As visualizações são somente leitura no SQLite. E se você emitir uma instrução DML como INSERT, UPDATEou DELETEcontra uma visualização, receberá um erro.

Quando uma visualização tem um INSTEAD OFgatilho, o gatilho será acionado quando você emitir uma instrução DML correspondente. Isso permite que você injete sua própria lógica no fluxo de processamento.

Por exemplo, se uma visualização tiver um INSTEAD OF INSERTgatilho, quando você emitir uma INSERTinstrução, o gatilho será acionado automaticamente. Dentro do gatilho, você pode inserir, atualizar ou excluir dados nas tabelas base.

Em outras palavras, os INSTEAD OFgatilhos permitem que as visualizações se tornem modificáveis.

O seguinte ilustra a sintaxe de criação de um INSTEAD OFgatilho no SQLite:

CREATE TRIGGER [IF NOT EXISTS] schema_ame.trigger_name
    INSTEAD OF [DELETE | INSERT | UPDATE OF column_name]
    ON table_name
BEGIN
    -- insert code here
END;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe:

  • Primeiro, especifique o nome do gatilho após as CREATE TRIGGERpalavras-chave. Use IF NOT EXISTSse quiser criar o gatilho apenas se ele existir.
  • Em segundo lugar, use as INSTEAD OFpalavras-chave seguidas por um evento desencadeador como INSERT, UPDATEou DELETE.
  • Terceiro, especifique o nome da visualização à qual o gatilho pertence.
  • Por fim, especifique o código que executa a lógica.

INSTEAD OFExemplo de gatilho SQLite

Para a demonstração, usaremos as tabelas Artistse Albumsdo banco de dados de exemplo .

Primeiro, crie uma visualização nomeada AlbumArtistscom base nos dados das tabelas Artistse Albums:

CREATE VIEW AlbumArtists(
    AlbumTitle, 
    ArtistName
) AS 
SELECT 
    Title, 
    Name
FROM 
    Albums
INNER JOIN Artists USING (ArtistId);
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, use esta consulta para verificar os dados da visualização:

SELECT * FROM AlbumArtists;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, insira uma nova linha na AlbumArtistsvisualização:

INSERT INTO AlbumArtists(AlbumTitle,ArtistName)
VALUES('Who Do You Trust?','Papa Roach');
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

SQLite emitiu o seguinte erro:

[SQLITE_ERROR] SQL error or missing database (cannot modify AlbumArtists because it is a view)    
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quarto, crie um INSTEAD OFgatilho que seja acionado quando uma nova linha for inserida na AlbumArtiststabela:

CREATE TRIGGER insert_artist_album_trg
    INSTEAD OF INSERT ON AlbumArtists
BEGIN
    -- insert the new artist first
    INSERT INTO Artists(Name)
    VALUES(NEW.ArtistName);
    
    -- use the artist id to insert a new album
    INSERT INTO Albums(Title, ArtistId)
    VALUES(NEW.AlbumTitle, last_insert_rowid());
END;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Neste gatilho:

  • Primeiro, insira uma nova linha na Artiststabela. SQLite gera automaticamente um número inteiro para a ArtistIdcoluna.
  • Segundo, use last_insert_rowid()para obter o valor gerado da ArtistIdcoluna e inserir uma nova linha na Albumstabela.

Por fim, verifique a inserção das tabelas Artistse :Albums

SELECT
  *   
FROM
    Artists
ORDER BY
    ArtistId DESC;

SELECT
*
FROM
    Albums
ORDER BY
    AlbumId DESC;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
SQLite INSTEAD OF Trigger - Tabela de Artistas

Como você pode ver na saída, uma nova linha foi inserida nas tabelas Artistse Albums.

Neste tutorial, você aprendeu sobre os INSTEAD OFgatilhos SQLite e como criar um INSTEAD OF INSERTgatilho para inserir dados em tabelas base por meio de uma visualização.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *