Olá pessoal!
Apresento a vocês a mais nova tradução, e dessa vez o assunto é TRIGGER, um grande recurso disponível a partir do MySQL 5.0.2.
Tal recurso permite que seja executado comando(s) (INSERT, DELETE, ...) antes ou depois de um certo evento.
Texto original (inglês): http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html
Segue abaixo a tradução feita da página referente ao comando CREATE TRIGGER:
CREATE [DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event ON tbl_name
FOR EACH ROW trigger_stmt
Esta declaração cria um novo trigger. O trigger é nomeado objeto de banco de dados que está associado com uma tabela, e é ativado quando um evento em particular ocorre pra esta tabela. Atualmente, CREATE TRIGGER exige o privilégio TRIGGER para a tabela associada com a trigger. (Esta declaração requer o privilégio SUPER antes da versão 5.1.6)
O trigger fica associado com uma tabela indicada por tbl_name, ficando assim, uma associação permanentemente. Você não pode associar um trigger a uma TEMPORARY TABLE ou uma VIEW.
Quando o trigger está ativado, a cláusula DEFINER determina o privilégio da aplicação.
trigger_time é o tempo de ação do trigger. Ele pode ser BEFORE (antes) ou AFTER (depois) para indicar que o trigger será ativado antes ou depois.
trigger_event indica o tipo de comando que irá ativar o trigger. O trigger_event possui as seguintes opções:
- INSERT:
- O trigger é ativado sempre que uma nova linha é inserida na tabela; por exemplo, através dos comandos INSERT, LOAD DATA, e REPLACE.
- UPDATE:
- O trigger é ativado sempre que uma nova linha é modificada; por exemplo, através do comando UPDATE.
- DELETE:
- O trigger é ativado sempre que uma nova linha é deletada da tabela; por exemplo, através dos comandos DELETE e REPLACE. Contudo, comandos DROP TABLE e TRUNCATE não ativam o trigger, porque eles não usam DELETE. Deletando uma partição também não ativa o DELETE trigger.
É importante saber que trigger_event não representa um tipo literal de comando SQL para ativar o trigger, desse modo ele representa um tipo de operação na tabela. Por exemplo, um INSERT trigger é ativado não somente pelo comando INSERT, mas também pelo comando LOAD DATA, porque ambos comandos inserem linhas em uma tabela.
Um exemplo potencialmente confuso disso é o INSERT INTO ... ON DUPLICATE KEY UPDATE ... : um BEFORE INSERT trigger será ativado para cada linha, seguido por qualquer um AFTER INSERT trigger ou ambos o BEFORE UPDATE e AFTER UPDATE triggers, dependendo da existência de uma chave duplicada para a linha.
Não é permitido dois triggers para um dada tabela com um trigger action time e event iguais. Por exemplo, você não pode ter dois BEFORE UPDATE triggers para uma tabela. Mas você pode ter um BEFORE UPDATE e um BEFORE INSERT trigger, ou um BEFORE UPDATE e um AFTER UPDATE trigger.
trigger_stmt é um comando para executar quando o trigger for ativado. Se você quer executar múltiplos comandos, use a BEGIN ... END construção composta de comando. Estes também habilitados para você usar alguns comandos como também permitindo escrever stored routines. Alguns comandos não são permitidos em triggers.
Nota: Atualmente, triggers não são ativadas por chaves estrageiras com ação em cascata. Esta limitação será suspendida possivelmente em breve.
No MySQL 5.1, você pode escrever triggers contendo referências diretas para nome de tabelas, como a trigger nomeada testref mostrada nesse exemplo:
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);
DELIMITER |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
DELIMITER ;
INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);
INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
Suponha que você insira os seguintes valores na tabela test1, como mostrado abaixo:
mysql> INSERT INTO test1 VALUES
-> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
Como resultado, a informação nas quatro tabelas foram o seguinte:
mysql> SELECT * FROM test1;
+------+
| a1 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM test2;
+------+
| a2 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM test3;
+----+
| a3 |
+----+
| 2 |
| 5 |
| 6 |
| 9 |
| 10 |
+----+
5 rows in set (0.00 sec)
mysql> SELECT * FROM test4;
+----+------+
| a4 | b4 |
+----+------+
| 1 | 3 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 0 |
| 6 | 0 |
| 7 | 1 |
| 8 | 1 |
| 9 | 0 |
| 10 | 0 |
+----+------+
10 rows in set (0.00 sec)
Você pode indicar colunas na tabela paciente (a tabela associada com um trigger) usando o apelido OLD e NEW. OLD.col_name indica uma coluna que existia antes da linha, isto é, modificado ou deletado. NEW.col_name indica a coluna de uma nova linha inserida ou existindo linha depois, isto é, modificado.
A cláusula DEFINER especifica a conta MySQL que será usada quando for verificar o privilégio de acesso no tempo de ativação da trigger. Se um usuário for informado, deve estar no formato 'user_name'@'host_name' (formato igualmente usado no comando GRANT). O user_name e host_name também são requeridos. CURRENT_USER também pode ser informado como CURRENT_USER(). O valor padrão DEFINER é o usuário usado para executar o comando CREATE TRIGGER. (Isto é igual a DEFINER = CURRENT_USER.)
Se você especificar a cláusula DEFINER, você não poderá setar o valor para alguma conta se você não for a própria, a não ser que você tenha o privilégio SUPER. Estas regras determinam o usuário indicado na cláusula DEFINER:
- Se você não tem o privilégio SUPER, somente o próprio usuário é o valor válido. Especificado literalmente ou usando CURRENT_USER. Você não pode setar o DEFINER para algum outro usuário.
- Se você tem o privilégio SUPER, você pode especificar sintaticamente legal um usuário. Se o usuário não existe atualmente, um aviso será gerado.
- Embora há possibilidade de criar triggers com valor inexistente em DEFINER. Isto não é uma boa idéia para triggers que são ativadas até o definido atualmente não existir. De outro modo, o comportamento com o comportamente a respeito de checagem de privilegio é indefinido.
Nota: Antes do MySQL 5.1.6, é requerido o privilégio SUPER para o uso de CREATE TRIGGER, então também a segunda a regra de procedimento se aplica. Enquanto o 5.1.6, CREATE TRIGGER requer o TRIGGER privilégio e SUPER é requerido somente para definir outro usuário na claúsula DEFINER.
MySQL checa o privilégio trigger deste modo:
- Durante CREATE TRIGGER, o usuario que executar o comando precisa ter o privilégio TRIGGER. (Privilégio SUPER até o MySQL 5.1.6)
- Durante o tempo de ativação trigger, privilégios são checkados outra vez do usuário indicado na cláusula DEFINER. Este usuário tem que ter estes privilégios:
- O privilégio TRIGGER. (SUPER até MySQL 5.1.6.)
- O privilégio SELECT para a tabela paciente se referida colunas da tabela via OLD.col_name ou NEW.col_name na definição no trigger.
- O privilégio UPDATE para a tabela paciente se colunas são alvos de SET NEW.col_name = valor indicado na definição no trigger.
- Qualquer outro privilégio que é normalmente requerido para execução de comandos de um trigger.
Créditos (tradução):
Diego R. Vieira
Diogo Galvão
Felipe Nascimento