Cláusula MySQL COM CHECK OPTION – 02

Resumo : neste tutorial, você aprenderá como garantir a consistência das visualizações do banco de dados usando a WITH CHECK OPTIONclá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 OPTIONcláusula ao criar ou modificar a visualização .

A WITH CHECK OPTIONé uma cláusula opcional da CREATE VIEWdeclaração. Isso WITH CHECK OPTIONevita 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 OPTIONclá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 OPTIONcláusula no final da CREATE VIEWinstrução.

Exemplo MySQL COM CHECK OPTION

Vamos explorar um exemplo de uso da WITH CHECK OPTIONclá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 employeestabela:

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 contractorsvisualizaçã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 contractorsvisualização é atualizável . Por exemplo, você pode inserir uma nova linha na employeestabela 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 Contractorna employeestabela por meio da contractorsvisualização.

Quarto, recupere os dados da contractorsvisualizaçã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 Blackfoi adicionado com sucesso.

O problema é que você pode adicionar um funcionário com outros tipos, como Full-timena employeestabela, por meio da contractorsvisualizaçã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 contractorsvisualização na employeestabela.

Para evitar isso, você precisa adicionar a WITH CHECK OPTIONcláusula à CREATE OR REPLACE VIEWinstruçã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 INSERTinstrução está em conformidade com a instrução SELECT que define a visualização. Se a INSERTinstrução não estiver em conformidade, o MySQL a rejeitará e emitirá um erro.

Resumo

  • Inclua a WITH CHECK OPTIONcláusula na CREATE VIEWdeclaração para garantir a consistência da visão.

Deixe um comentário

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