décembre
2010
La théorie relationnelle EXIGE que chaque table DOIT avoir une clé primaire.
Mais les éditeurs de SGBDR sont permissifs vis à vis de cette recommandation. Conséquence on voit dans des bases de données
des tables contenant des milliers de lignes sans clé primaire (PK) ! Le constat est décevant …
——————————————————–
–> SQL 2005/2008 : Afficher les tables sans PK sans FK :
——————————————————–
SELECT DB_NAME() + '.' + object_schema_name(t.object_id) + '.' + t.name AS [Tables sans PK sans FK]
FROM sys.tables t
WHERE OBJECTPROPERTY(object_id, 'IsPrimaryKey') = 0
AND OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 0
AND OBJECTPROPERTY(object_id, 'IsForeignKey') = 0
AND OBJECTPROPERTY(object_id, 'TableHasForeignKey') = 0
AND OBJECTPROPERTY(object_id, 'TableHasForeignRef') = 0
AND OBJECTPROPERTY(object_id, 'IsUserTable') = 1
ORDER BY [Tables sans PK sans FK]
——————————————————–
–> SQL 2000 : Afficher les tables sans PK sans FK
——————————————————–
SELECT t.TABLE_CATALOG + '.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME AS [Tables sans PK sans FK]
FROM INFORMATION_SCHEMA.tables t
WHERE OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'IsPrimaryKey') = 0
AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasPrimaryKey') = 0
AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'IsForeignKey') = 0
AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasForeignKey') = 0
AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasForeignRef') = 0
AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'IsUserTable') = 1
ORDER BY [Tables sans PK sans FK]
/*===========================================================================================
–> PROCEDURES STOCKEES
– Procdure Stocke permettant d'afficher les tables sans cl primaire(PK)
– SQL SERVER 2005-2008
– Version1
– Auteur : Etienne ZINZINDOHOUE
—————— Exemple d'utilisation ———————————————–
EXEC usp_AfficheTableSansPK_2005_2008 @InstanceName = N'MONSERVEUR\MONINSTANCE', @BaseName = N'AdventureWorks'
—————————————————————————————–
===========================================================================================*/
/***************************** PRE-REQUIS **********************************************
Pour utiliser la procdure 'sp_primarykeys' il faut configurer l'option DATA ACCESS; du serveur
En excutant la commande suivante :
EXEC sp_serveroption 'MONSERVEUR\MONINSTANCE', 'data access', 'true'
Si non lors de l'excution de la procdure vous aurez le message d'erreur :
——————————————————————
Msg 7411, Level 16, State 1, Procedure sp_primarykeys, Line 10
Server 'MONSERVEUR\MONINSTANCE' is not configured for DATA ACCESS.
——————————————————————
–OU En franais
——————————————————————
Msg 7411, Level 16, State 1, Procedure sp_primarykeys, Line 10
Le serveur 'MONSERVEUR\MONINSTANCE' n'est pas configur pour DATA ACCESS.
——————————————————————
****************************************************************************************/
CREATE PROCEDURE usp_AfficheTableSansPK_2005_2008
@InstanceName VARCHAR(50),@BaseName VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON
DECLARE @maTableVar table (
TABLE_CAT sysname
,TABLE_SCHEM sysname
,TABLE_NAME sysname
,COLUMN_NAME sysname
,KEY_SEQ int
,PK_NAME sysname NULL
)
INSERT INTO @maTableVar
EXEC ('EXEC sp_primarykeys @table_server = N'''+@InstanceName +''', @table_catalog = N'''+@BaseName +'''');
SELECT t.TABLE_CATALOG + '.' + t.TABLE_SCHEMA +'.'+ t.TABLE_NAME AS [Base.Schema.Table]
FROM INFORMATION_SCHEMA.TABLES t
WHERE t.TABLE_CATALOG = + @BaseName AND TABLE_TYPE = 'BASE TABLE'
EXCEPT
SELECT DISTINCT TABLE_CAT + '.' + TABLE_SCHEM +'.'+ TABLE_NAME AS [Base.Schema.Table]
FROM @maTableVar
END
————————————————————————————
–> Discussion associée
————————————————————————————
————————————————————————————
Etienne ZINZINDOHOUE
————————————————————————————
Juste pour compléter. Il est également possible d’implémenter des règles comme ceci de façon centralisée avec la gestion des stratégies avec SQL Server 2008 .
++