Bonjour,

Je suis débutant en TRANSAC-SQL.
J'ai essayer de faire un script qui tronque le transaction log de toutes les bases utilisateurs de mon serveur dont voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
/*Procedure permettant de tronquer tous 
les logs de toutes base de données du server
sauf les bases systeme (master,model,msdb,Northwind,pubs,tempdb)*/
 
CREATE PROCEDURE TRUNCATE_TRANSACTION_LOG_ALL_DB
AS
 
DECLARE @dbname varchar(50)
DECLARE @logname varchar (50)
 
DECLARE alldbname CURSOR FOR
 
--On selectionne tous les noms des base dans la table sysdatabases
SELECT name from master.dbo.sysdatabases;
 
OPEN alldbname
 
--On initialise la variable @dbname avec la première valeur renvoyée par la requête
FETCH alldbname INTO @dbname
 
--Tant que l'on a des résultats
WHILE @@fetch_status = 0
BEGIN
	SET @logname = @dbname + '_log'
	-- Si la base n'est pas une base systeme
	if @dbname <> 'master' and @dbname <> 'model' and @dbname <> 'msdb' and @dbname <> 'Northwind' and @dbname <> 'pubs' and @dbname <> 'tempdb'
	BEGIN	
		--On tronque le transaction log
		backup log @dbname with truncate_only
		dbcc shrinkfile (@logname, truncateonly)
	END
 
--On initialise @dbname avec l'enregistrement suivant
FETCH alldbname INTO @dbname
END
 
CLOSE alldbname
 
DEALLOCATE alldname
le problème c'est que j'obtient l'erreur suivante quand je l'insère dans un job :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Msg 8985, Sev 16: Could not locate file 'xxxxx_log' in sysfiles. [SQLSTATE 42000]
Msg 2528, Sev 16: DBCC execution completed. If DBCC printed error messages, contact your system administrator. [SQLSTATE 01000]
Cette erreur apparait en fait car je ne suis pas positionné sur la base avant de faire le shrinkfile.
Mais quand j'essaye de faire un "USE @dbname" j'obtient l'erreur suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Server: Msg 154, Level 15, State 1, Procedure TRUNCATE_TRANSACTION_LOG_ALL_DB, Line 25
a USE database statement is not allowed in a procedure or trigger.
Comment faire autrement.

Merci d'avance