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 12/01/2012, 13h58   #1
Futur Membre du Club
 
Étudiant
Inscription : avril 2008
Messages : 42
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2008
Messages : 42
Points : 16
Points : 16
Par défaut Avis sur code T-SQL de vérification de sauvegarde , truncate et creation d'index

Bonjour,
Je dois planifier la création d'un index et la suppression certaines données.
Pour cela je vais créer un job
je veux que se job vérifie dans un premier que ma base a bien été sauvegardé par un plan de maintenance .
Pour cela ,je vérifie si j'ai bien un enregistrement dasn la table backupset.
SI il n'y en a pas j'envoie un mail d'erreur et je ne fais rien.
S'il il y en a un j'exécute mon Truncate et je crée l'index.

Mes questions sont les suivantes :
• la manière de procéder est elle correct et le code n'est il pas trop "moche" ?
• Est il possible de récupérer le code retour d'une instruction (ici le truncate et la création de l'index) ?
Si oui comment , je n'ai rien trouvé :/
• Enfin l'ajout d'un RESTORE VERIFYONLY apporte t'il vraiment quelque chose ?

merci à vous,

le code en question :
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
 
Declare @body1 varchar(100)
 
USE msdb; 
 
IF (SELECT count (*) FROM backupset WHERE database_name = 'ARAMIS_MSCRM'AND backup_finish_date BETWEEN '2012/01/11' AND '2012/01/12') = 0 
	Begin
		SET @body1 = 'problème sur la sauvegarde de ARAMIS_MSCM le truncate et l index ne se feront pas ' 
		EXEC msdb.dbo.sp_send_dbmail @recipients='toto@tata.f', 
		@subject = 'la base n a pas ete sauvegardee ', 
		@body = @body1, 
		@body_format = 'HTML' ; 
	END
ELSE
		Begin
 
		USE ARAMIS_MSCRM;
 
		TRUNCATE TABLE DUPLICATERECORDBASE;
 
		CREATE NONCLUSTERED INDEX CRM_DuplicateRecord_AsyncOperationID ON [dbo].[DuplicateRecordBase] ([AsyncOperationID])
 
 
		SET @body1 = 'Job Creation Truncate et Index OK' 
		EXEC msdb.dbo.sp_send_dbmail @recipients='toto@tata.fr', 
		@subject = ' ', 
		@body = @body1, 
		@body_format = 'HTML' ; 
	END
GO
krousty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 17h25   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 670
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 670
Points : 8 732
Points : 8 732
Bonjour,

Le fond est là, la forme est peut-être à changer un peu
En effet vous pouvez tout à fait créer cette procédure stockée dans la base de données ARAMIS_MSCRM, et référencer la base de données système msdb ... et inversement

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
41
42
43
44
USE ARAMIS_MSCRM
GO
 
CREATE PROCEDURE usp_maintenance
AS
BEGIN
	SET NOCOUNT ON
 
	DECLARE @date_deb datetime
		, @date_fin datetime
		, @mail_corps varchar(100)
		, @mail_sujet varchar(100)
 
	SELECT	@date_deb = CAST(FLOOR(CAST(GETDATE() AS float)) AS datetime)
	SELECT	@date_fin = DATEADD(day, 1, @date_deb)
 
	IF EXISTS
	(
		SELECT	*
		FROM	msdb.dbo.backupset
		WHERE	database_name = 'ARAMIS_MSCRM'
		AND	backup_finish_date BETWEEN @date_deb AND @date_fin
	)
	BEGIN
		TRUNCATE TABLE dbo.DUPLICATERECORDBASE
 
		CREATE NONCLUSTERED INDEX CRM_DuplicateRecord_AsyncOperationID
		ON dbo.DuplicateRecordBase (AsyncOperationID)
 
		SELECT @mail_corps = 'Job Creation Truncate et Index OK'
			, @mail_sujet = 'Sauvegarde et création de l''index  réussis !'
	END
	ELSE
	BEGIN
		SELECT @mail_corps = 'problème sur la sauvegarde de ARAMIS_MSCM le TRUNCATE et l index n''ont pas été créés' 
			, @mail_sujet = 'Sauvegarde et création de l''index  échoués !'
	END
 
	EXEC msdb.dbo.sp_send_dbmail
		@recipients = 'toto@tata.f', 
		@subject = @mail_sujet,
		@body = @mail_corps, 
		@body_format = 'HTML' 
END
Vous pouvez aussi ne spécifier qu'un seul appel à la procédure stockée, ce qui en simplifiera sa maintenance

Enfin je ne sais pas si la table dbo.DuplicateRecordBase a un index cluster, ni ce que vous faites dessus.
Si vous créez l'index non-cluster en avance, et que vous faites un INSERT massif sur cette table, il y a de bonnes chances pour les statistiques de l'index ne soient pas correctes à la fin de l'INSERT.
Donc vos requêtes qui utilisent cette table peuvent en souffir.
En créer l'index après l'INSERT massif, vous évitez ce problème, et évitez un léger ralentissement du à la maintenance de cet index.

@++
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 18h57   #3
Futur Membre du Club
 
Étudiant
Inscription : avril 2008
Messages : 42
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2008
Messages : 42
Points : 16
Points : 16
Re,
Merci pour votre réponse et les corrections
la manipulation est normalement exceptionnel et ne devrait plus être à faire c'est pourquoi je pensais mettre directement mon code dans le travaille. je n'avais pas pensé à passer par procédure stocké.
La tables DUPLICATERECORDBASE contient bien un index cluster (je viens de vérifier).
je vous avouerais que je ne sais pas non plus à quoi elle sert , je sais qu'elle sert pour un CRM et que c'est le support de Microsoft qui vient de nous demander de le créer suite à des lenteurs sur le CRM .
Quand à la validation du Truncate et de la création de l'index avec de simple requêtes.
Je testerai tout ça demain et vous ferai un retour.
Cordialement,
krousty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h17.


 
 
 
 
Partenaires

Hébergement Web