Opérateur Showplan Assert

L'opérateur Assert vérifie une condition. Il valide, par exemple, l'intégrité référentielle ou s'assure qu'une sous-requête scalaire retourne une ligne. Pour chaque ligne d'entrée, l'opérateur Assert résout l'expression de la colonne Argument du plan d'exécution. Si cette expression a pour résultat NULL, l'opérateur Assert passe la ligne et la requête d'exécution se poursuit. Si la valeur de cette expression n'est pas NULL, l'erreur adéquate sera générée.

L'opérateur Assert est un opérateur physique.

Icône de l'opérateur AssertIcône du plan d'exécution graphique

Exemples

A. Validation d'une contrainte CHECK

L'exemple suivant met à jour la valeur dans la colonne Gender pour un ID d'employé spécifié dans la table Employee. La table possède une contrainte CHECK qui limite les valeurs qui sont acceptées dans la colonne aux valeurs 'F' et 'M'. La sortie du plan d'exécution de la requête indique que l'optimiseur de requête utilise l'opérateur Assert pour valider la valeur spécifiée dans l'instruction UPDATE par rapport à la contrainte CHECK et génère une erreur si les conditions de la contrainte ne sont pas satisfaites.

USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
GO
SET SHOWPLAN_ALL ON;
GO
UPDATE HumanResources.Employee
SET Gender = 'X' WHERE BusinessEntityID = 1;
GO
SET SHOWPLAN_ALL OFF;
GO

La sortie du plan d'exécution de l'opérateur Assert est affichée ci-dessous.

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN upper([AdventureWorks2008R2].[HumanResources].[Employee].[Gender])<>N'F' AND 
upper([AdventureWorks2008R2].[HumanResources].[Employee].[Gender])<>N'M' THEN 
    (0) ELSE NULL END)

B. Validation d'une contrainte FOREIGN KEY

L'exemple ci-dessous supprime une ligne de la table Person.Person. Dans ce cas, il existe six tables qui possèdent une référence de clé étrangère à la colonne BusinessEntityID de cette table. La sortie du plan d'exécution de la requête indique que l'optimiseur de requête utilise l'opérateur Assert pour valider l'instruction DELETE par rapport à chaque contrainte.

USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Person WHERE BusinessEntityID = 1209;
GO
SET SHOWPLAN_ALL OFF;
GO

La sortie du plan d'exécution de l'opérateur Assert est affichée ci-dessous.

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN NOT [Expr1030] IS NULL THEN (0) ELSE CASE WHEN NOT 
[Expr1031] IS NULL THEN (1) ELSE CASE WHEN NOT [Expr1032] IS NULL THEN 
(2) ELSE CASE WHEN NOT [Expr1033] IS NULL THEN (3) ELSE CASE WHEN NOT 
[Expr1034] IS NULL THEN (4) ELSE CASE WHEN NOT [Expr1035] IS NULL THEN (5) ELSE NULL END END END END END END)

C. Validation d'une sous-requête scalaire

L'exemple suivant utilise une sous-requête dans la clause WHERE de la requête. Cet exemple utilise intentionnellement une sous-requête qui retourne plusieurs lignes pour forcer l'opérateur Assert à générer une erreur. La sortie du plan d'exécution de la requête indique que l'optimiseur de requête utilise l'opérateur Assert pour vérifier que la sous-requête spécifiée dans l'instruction SELECT retourne uniquement une ligne.

USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
SELECT BusinessEntityID 
FROM HumanResources.Employee
WHERE BusinessEntityID = (SELECT BusinessEntityID FROM Person.Person);
GO
SET SHOWPLAN_ALL OFF;
GO
-- Run the query again to display the error message raised by the 
-- Assert Operator.
SELECT BusinessEntityID 
FROM HumanResources.Employee
WHERE BusinessEntityID = (SELECT BusinessEntityID FROM Person.Person);
GO

La sortie du plan d'exécution de l'opérateur Assert est affichée ci-dessous.

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN [Expr1007]>(1) THEN (0) ELSE NULL END)