Resumo : neste tutorial você aprenderá sobre os INSTEAD OF
triggers SQLite e como criar um INSTEAD OF
trigger para inserir dados em tabelas base através de uma view.
O que são INSTEAD OF
gatilhos 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
, UPDATE
ou DELETE
contra uma visualização, receberá um erro.
Quando uma visualização tem um INSTEAD OF
gatilho, 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 INSERT
gatilho, quando você emitir uma INSERT
instrução, o gatilho será acionado automaticamente. Dentro do gatilho, você pode inserir, atualizar ou excluir dados nas tabelas base.
Em outras palavras, os INSTEAD OF
gatilhos permitem que as visualizações se tornem modificáveis.
O seguinte ilustra a sintaxe de criação de um INSTEAD OF
gatilho 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 TRIGGER
palavras-chave. UseIF NOT EXISTS
se quiser criar o gatilho apenas se ele existir. - Em segundo lugar, use as
INSTEAD OF
palavras-chave seguidas por um evento desencadeador comoINSERT
,UPDATE
ouDELETE
. - Terceiro, especifique o nome da visualização à qual o gatilho pertence.
- Por fim, especifique o código que executa a lógica.
INSTEAD OF
Exemplo de gatilho SQLite
Para a demonstração, usaremos as tabelas Artists
e Albums
do banco de dados de exemplo .
Primeiro, crie uma visualização nomeada AlbumArtists
com base nos dados das tabelas Artists
e 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 AlbumArtists
visualizaçã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 OF
gatilho que seja acionado quando uma nova linha for inserida na AlbumArtists
tabela:
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
Artists
tabela. SQLite gera automaticamente um número inteiro para aArtistId
coluna. - Segundo, use
last_insert_rowid()
para obter o valor gerado daArtistId
coluna e inserir uma nova linha naAlbums
tabela.
Por fim, verifique a inserção das tabelas Artists
e :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 )
Como você pode ver na saída, uma nova linha foi inserida nas tabelas Artists
e Albums
.
Neste tutorial, você aprendeu sobre os INSTEAD OF
gatilhos SQLite e como criar um INSTEAD OF INSERT
gatilho para inserir dados em tabelas base por meio de uma visualização.