Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/02/2011, 16h31   #1
Invité de passage
 
Inscription : février 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 4
Points : 1
Points : 1
Par défaut déclencheur DDL qui modifie le nom des tables

Bonjour,
J'ai à réaliser un tp de base de données et je bloque sur la première question :s
Quelqu'un aurait-il donc une piste à me donner?

La question est la suivante :
Il faut que je réalise un déclencheur DDL qui me permette de respecter la règle de nommage suivante :

nom table commencent par T_
nom vue commencent par V_
nom procédures commencent par P_
nom fonction (UDF) commencent par F_
nom contrainte de clef primaire commencent par PK_
nom contrainte de clef étrangère commencent par FK_
nom contrainte d'unicité commencent par UK
nom contrainte de validité commencent par CK_

Donc lorsque je crée une table par exemple, le déclencheur vérifie si elle commence par T_ et le rajoute si ce n'est pas le cas.

Je crée un trigger for CREATE_TABLE mais je ne sais pas comment récupérer le nom de la table qui vient d'être créée pour faire mes vérifications de nom...

Quelqu'un pourrait-il m'aider?
Merci.
sqlamateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 16h49   #2
Membre régulier
 
Homme Christian Brossault
Administrateur de base de données
Inscription : avril 2006
Messages : 52
Détails du profil
Informations personnelles :
Nom : Homme Christian Brossault
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Administrateur de base de données

Informations forums :
Inscription : avril 2006
Messages : 52
Points : 72
Points : 72
Bonjour,

Vous êtes sous quel version de SQL SERVER ?
En 2005/2008 : avez vous regarder du côté du répertoire "policy management" (conditions et facets) de management studio ?

l'introduction de ces règles applicatives dans sql server va le faire pour vous.
Créez une condition d'abord et ensuite votre règle (qui va utiliser la condition préalablement créée)

Christian
Christianbt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 10h58   #3
Membre éprouvé
 
Homme Hamid MIRA
Ingénieur développement logiciels
Inscription : septembre 2003
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Hamid MIRA
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2003
Messages : 177
Points : 413
Points : 413
La réponse précédente de Christianbt est tout à fait correcte, et la mieux appropriée pour répondre à ta question.
Je me permet de juste de préciser la traduction exacte du terme anglais "policy management". En français ce terme a été traduit par "Gestion basée sur des stratégies"

Ci-dessous quelques liens intéressants traitant de ce sujet :
http://mikedavem.developpez.com/tuto...l-server-2008/

http://blog.developpez.com/elsuket/p...ase-de-d-2008/

A+
hmira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 03h49   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

Si c'est bien un trigger DDL que l'on vous demande, c'est dommage que vous n'ayez pas posté ce que vous avez écrit jusque là.

Voici le trigger :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
ALTER TRIGGER TR_DB_CHECK_OBJECT_NAME
	ON DATABASE
	FOR CREATE_TABLE, CREATE_VIEW, CREATE_PROCEDURE, CREATE_FUNCTION, ALTER_TABLE
AS
BEGIN
	DECLARE	@ddl_event_data xml
		, @object_name nvarchar(256)
		, @object_type nvarchar(60)
		, @new_object_name nvarchar(256)
 
	-- Capture des caractéristiques de l'événement DDL
	SET	@ddl_event_data = EVENTDATA()
 
	-- Extraction du nom de l'objet
	SELECT	@object_name = @ddl_event_data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(128)')
 
	-- Recherche du type de l'object
	SELECT	@object_type = type_desc
	FROM	sys.objects
	WHERE	name = @object_name
 
	-- Calcul du nouveau nom de l'object, le cas échéant
	SELECT	@new_object_name = CASE
					WHEN @object_type = 'CHECK_CONSTRAINT' AND @object_name NOT LIKE 'CK?_%' ESCAPE '?' THEN 'CK_' + @object_name
					WHEN @object_type = 'UNIQUE_CONSTRAINT' AND @object_name NOT LIKE 'UK?_%' ESCAPE '?' THEN 'UK_' + @object_name
					WHEN @object_type = 'PRIMARY_KEY_CONSTRAINT' AND @object_name NOT LIKE 'PK?_%' ESCAPE '?' THEN 'PK_' + @object_name
					WHEN @object_type = 'FOREIGN_KEY_CONSTRAINT' AND @object_name NOT LIKE 'CK?_%' ESCAPE '?' THEN 'FK_' + @object_name
					WHEN @object_type = 'SQL_SCALAR_FUNCTION' AND @object_name NOT LIKE 'F?_%' ESCAPE '?' THEN 'F_' + @object_name
					WHEN @object_type = 'SQL_INLINE_TABLE_VALUED_FUNCTION' AND @object_name NOT LIKE 'F?_%' ESCAPE '?' THEN 'F_' + @object_name
					WHEN @object_type = 'SQL_TABLE_VALUED_FUNCTION' AND @object_name NOT LIKE 'F?_%' ESCAPE '?' THEN 'F_' + @object_name
					WHEN @object_type = 'SQL_STORED_PROCEDURE' AND @object_name NOT LIKE 'P?_%' ESCAPE '?'THEN 'P_' + @object_name
					WHEN @object_type = 'VIEW' AND @object_name NOT LIKE 'V?_%' ESCAPE '?' THEN 'V_' + @object_name
					WHEN @object_type = 'USER_TABLE' AND @object_name NOT LIKE 'T?_%' ESCAPE '?' THEN 'T_' + @object_name
				END
 
	IF @new_object_name IS NOT NULL
	BEGIN
		EXEC sp_rename @object_name, @new_object_name
	END	
END
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 07h23   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
S'il s'agit juste de renommer les tables, alors dans le trigger récupérez le nom de l'objet ainsi que son schéma et utilisez la procédure sp_rename pour renommer .

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 11h50   #6
Invité de passage
 
Inscription : février 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 4
Points : 1
Points : 1
Merci pour vos réponses, cela fonctionne. Je n'avais pas posté ce que j'avais déjà fait parce que je n'arrivais justement pas à récupérer le nom des tables, c'est ce qui me bloquait :s
sqlamateur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h24.


 
 
 
 
Partenaires

Hébergement Web