Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
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 22/08/2006, 17h59   #1
Membre habitué
 
Inscription : mars 2006
Messages : 293
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 293
Points : 140
Points : 140
Par défaut [ASE]Vider la base tempdb .

Je rebondis sur le sujet Résolu "[ASE]création de table temporaire", je me demandais comment vider la tempdb de toutes ses tables tempo d'un seul coup ??? Bien sur un redémarrage du serveur fait cela car je crois qu'il prend dans Model pour refaire une base tempdb... Mais dans mon contexte c'est pas possible ...
Donc faut'il passer automatiquement par un script?? si c'est le cas (ce que je pense ...) il faut faire une requète dans sysprocesses pour récupérer les spid et les killer; Mais comment réinjecter les spid ainsi trouvé dans une instruction droptable ???
Je sais le dev c'est pas ma passion mais si vous pouvez m'aider ce serait sympa.
lut'
arona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2006, 08h18   #2
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Pour vider tempdb il faut évidemment dropper les tables utilisateurs qui s'y trouvent. Ces tables sont soit des table temporaires du type #xyz, et dans ce cas elles sont droppées lorsque la connexion ou la proc dans laquelle elles ont été créés termine, ou alors ce sont des tables "normales", qui seront détruites uniquement lors du redémarrage de l'instance.

On peut trouver la liste des tables temporaires via la table sysobjects de tempdb:
Code :
1
2
3
4
5
6
7
8
 
SELECT name, loginname FROM tempdb..sysobjects WHERE name LIKE '#%'
go
name                           loginame
------------------------------ ------------------------------
#foo_________00000170008607235 mpeppler
 
(1 row affected)
Le numero du spid du process est dans les 5 chiffres commençant à la position 16 du nom nom interne de la table (dans ce cas '17'). Donc on peut trouver tous les SPID qui ont une ou plusieurs tables temporaires avec la requête suivante:
Code :
1
2
3
4
 
SELECT DISTINCT substring(name, 16, 5) 
  FROM tempdb..sysobjects 
 WHERE name LIKE '#%'
Et on peut ensuite utiliser cette information pour killer les sessions...

Mais dans un serveur actif cette information risque bien d'être très fluide (cad que les SPIDs trouvés n'aurons peut-être déjà plus de tables temporaires lorsque le kill est exécuté, alors que d'autres SPIDs en auront probablement créées...)

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2006, 16h24   #3
Membre habitué
 
Inscription : mars 2006
Messages : 293
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 293
Points : 140
Points : 140
Ok pour la récupération du spid mais comment faire pour réinjecter la sortie de notre requète vers une instruction kill ... En fait c'est un bout de code qu'il me faut...
Merci en tout cas de ta réponse.
cdlt
arona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2006, 16h42   #4
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
Code :
1
2
3
4
 
SELECT DISTINCT "kill " + substring(name, 16, 5) + char(10) + "go" 
  FROM tempdb..sysobjects 
 WHERE name LIKE '#%'
On redirige tout cela dans un fichier, et on exécute le script.

Autrement on peut faire un curseur, et puis faire un kill dans un execute immediate:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
declare kill_csr cursor FOR
   SELECT DISTINCT substring(name, 16, 5) 
  FROM tempdb..sysobjects 
 WHERE name LIKE '#%'
go
declare @spid varchar(20)
        , @cmd varchar(50)
 
open kill_csr
 
fetch kill_csr INTO @spid
while @@sqlstatus = 0
begin
    SELECT @cmd = "kill "+@spid
    exec (@cmd)
    fetch kill_csr INTO @spid
end
 
close kill_csr
deallocate cursor kill_csr
 
go
Note - code non testé!!

Michael
__________________
Michael Peppler
Membre de TeamSybase - www.teamsybase.com

"A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2006, 17h00   #5
Membre habitué
 
Inscription : mars 2006
Messages : 293
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 293
Points : 140
Points : 140
Ben écoute merci bien c'est éxactement ce que je voulais..
Merci encore mickael.
arona 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 07h53.


 
 
 
 
Partenaires

Hébergement Web