Resumo : neste tutorial, você aprenderá como garantir a consistência das visualizações do banco de dados usando a WITH CHECK OPTION
cláusula.
Introdução à cláusula WITH CHECK OPTION
Às vezes, você cria uma visualização para revelar os dados parciais de uma tabela. Porém, uma visualização simples é atualizável e, portanto, é possível atualizar dados que não são visíveis através da visualização. Esta atualização torna a visualização inconsistente.
Para garantir a consistência da visualização, você usa a WITH CHECK OPTION
cláusula ao criar ou modificar a visualização .
A WITH CHECK OPTION
é uma cláusula opcional da CREATE VIEW
declaração. Isso WITH CHECK OPTION
evita que você atualize ou insira linhas que não são visíveis na visualização.
Em outras palavras, sempre que você atualiza ou insere uma linha das tabelas base através de uma visualização, o MySQL garante que a operação de inserção ou atualização está em conformidade com a definição da visualização.
O seguinte ilustra a sintaxe da WITH CHECK OPTION
cláusula:
CREATE OR REPLACE VIEW view_name
AS
select_statement
WITH CHECK OPTION;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Nesta sintaxe, você adiciona a WITH CHECK OPTION
cláusula no final da CREATE VIEW
instrução.
Exemplo MySQL COM CHECK OPTION
Vamos explorar um exemplo de uso da WITH CHECK OPTION
cláusula.
Primeiro, crie uma tabela chamada contatos:
CREATE DATABASE mydb;
USE mydb;
CREATE TABLE employees(
id INT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(50) NOT NULL,
name VARCHAR(255) NOT NULL
);
INSERT INTO employees (type, name)
VALUES
('Full-time', 'John Doe'),
('Contractor', 'Jane Smith'),
('Temp', 'Alice Johnson'),
('Full-time', 'Bob Anderson'),
('Contractor', 'Charlie Brown'),
('Temp', 'David Lee'),
('Full-time', 'Eva Martinez'),
('Contractor', 'Frank White'),
('Temp', 'Grace Taylor'),
('Full-time', 'Henry Walker'),
('Contractor', 'Ivy Davis'),
('Temp', 'Jack Turner'),
('Full-time', 'Kelly Harris'),
('Contractor', 'Leo Wilson'),
('Temp', 'Mia Rodriguez'),
('Full-time', 'Nick Carter'),
('Contractor', 'Olivia Clark'),
('Temp', 'Pauline Hall'),
('Full-time', 'Quincy Adams');
SELECT * FROM employees;
Linguagem de código: PHP ( php )
Saída:
+----+------------+---------------+
| id | type | name |
+----+------------+---------------+
| 1 | Full-time | John Doe |
| 2 | Contractor | Jane Smith |
| 3 | Temp | Alice Johnson |
| 4 | Full-time | Bob Anderson |
| 5 | Contractor | Charlie Brown |
| 6 | Temp | David Lee |
| 7 | Full-time | Eva Martinez |
| 8 | Contractor | Frank White |
| 9 | Temp | Grace Taylor |
| 10 | Full-time | Henry Walker |
| 11 | Contractor | Ivy Davis |
| 12 | Temp | Jack Turner |
| 13 | Full-time | Kelly Harris |
| 14 | Contractor | Leo Wilson |
| 15 | Temp | Mia Rodriguez |
| 16 | Full-time | Nick Carter |
| 17 | Contractor | Olivia Clark |
| 18 | Temp | Pauline Hall |
| 19 | Full-time | Quincy Adams |
+----+------------+---------------+
19 rows in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
Segundo, crie uma visão chamada contratantes com base na employees
tabela:
CREATE OR REPLACE VIEW contractors
AS
SELECT id, type, name
FROM
employees
WHERE
type = 'Contractor';
Linguagem de código: PHP ( php )
Terceiro, consulte os dados da contractors
visualização:
SELECT * FROM contractors;
Saída:
+----+------------+---------------+
| id | type | name |
+----+------------+---------------+
| 2 | Contractor | Jane Smith |
| 5 | Contractor | Charlie Brown |
| 8 | Contractor | Frank White |
| 11 | Contractor | Ivy Davis |
| 14 | Contractor | Leo Wilson |
| 17 | Contractor | Olivia Clark |
+----+------------+---------------+
6 rows in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
A contractors
visualização é atualizável . Por exemplo, você pode inserir uma nova linha na employees
tabela por meio da visualização do contratante:
INSERT INTO contractors(name, type)
VALUES('Andy Black', 'Contractor');
Linguagem de código: JavaScript ( javascript )
Saída:
Query OK, 1 row affected (0.00 sec)
Linguagem de código: CSS ( css )
A instrução insere um novo funcionário com o tipo Contractor
na employees
tabela por meio da contractors
visualização.
Quarto, recupere os dados da contractors
visualização:
+----+------------+---------------+
| id | type | name |
+----+------------+---------------+
| 2 | Contractor | Jane Smith |
| 5 | Contractor | Charlie Brown |
| 8 | Contractor | Frank White |
| 11 | Contractor | Ivy Davis |
| 14 | Contractor | Leo Wilson |
| 17 | Contractor | Olivia Clark |
| 20 | Contractor | Andy Black |
+----+------------+---------------+
7 rows in set (0.00 sec)
Linguagem de código: JavaScript ( javascript )
A saída mostra que Andy Black
foi adicionado com sucesso.
O problema é que você pode adicionar um funcionário com outros tipos, como Full-time
na employees
tabela, por meio da contractors
visualização. Por exemplo:
INSERT INTO contractors(name, type)
VALUES('Deric Seetoh', 'Full-time');
Linguagem de código: JavaScript ( javascript )
Saída:
Query OK, 1 row affected (0.00 sec)
Linguagem de código: CSS ( css )
Esta instrução insere com êxito uma nova linha que não é visível pela contractors
visualização na employees
tabela.
Para evitar isso, você precisa adicionar a WITH CHECK OPTION
cláusula à CREATE OR REPLACE VIEW
instrução assim:
CREATE OR REPLACE VIEW contractors
AS
SELECT id, type, name
FROM
employees
WHERE
type = 'Contractor'
WITH CHECK OPTION;
Linguagem de código: PHP ( php )
Se você tentar inserir ou atualizar linhas que não são visíveis pelo contratante, receberá um erro. Por exemplo:
INSERT INTO contractors(name, type)
VALUES('Brad Knox', 'Full-time');
Linguagem de código: JavaScript ( javascript )
Saída:
ERROR 1369 (HY000): CHECK OPTION failed 'mydb.contractors'
Linguagem de código: JavaScript ( javascript )
Por causa do WITH CHECK OPTION
, o MySQL verifica se a INSERT
instrução está em conformidade com a instrução SELECT que define a visualização. Se a INSERT
instrução não estiver em conformidade, o MySQL a rejeitará e emitirá um erro.
Resumo
- Inclua a
WITH CHECK OPTION
cláusula naCREATE VIEW
declaração para garantir a consistência da visão.