1. #1
    Membre du Club

    Profil pro
    Inscrit en
    juillet 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2003
    Messages : 44
    Points : 47
    Points
    47

    Par défaut [SQL-Server] BACKUP - Fermer les connexions de force

    Comment est-il possible d'ejecter tous les utilisateurs d'une base avant la restauration d'une autre version de celle-ci ?

    Quand je veux effectuer un backup à partir de mon application, cette même application utilise des connexions et je n'arrive pas à les fermer.
    De plus, d'autres utilisateurs peuvent utiliser cette base en réseau. Donc je voudrais pouvoir forcer la perte de toutes les connexions en cours.

    Ce doit bien être possible car SQL Serveur le demande avant de détacher une base.

    Merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2003
    Messages
    2 728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : mars 2003
    Messages : 2 728
    Points : 4 375
    Points
    4 375

    Par défaut

    Il vous faut tuer tous les processus qui tournent sur la base.
    Regarde du côté de sp_who et de sp_kill.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    juillet 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2003
    Messages : 44
    Points : 47
    Points
    47

    Par défaut

    Merci beaucoup.

    Une petite rectification:
    sp_kill n'existe pas. Tu confond avec KILL.

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    mars 2003
    Messages
    2 728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : mars 2003
    Messages : 2 728
    Points : 4 375
    Points
    4 375

    Par défaut

    Merci d'avoir porté cela à mon attention.
    Je n'ai pas vérifié avant de poster.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    décembre 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2003
    Messages : 397
    Points : 142
    Points
    142

    Par défaut

    Salut,

    je ne trouve pas de sp_who.exe sur le serveur.
    C'est un truc à installer en plus ?

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2002
    Messages : 1 249
    Points : 1 743
    Points
    1 743

    Par défaut

    non, c'est une procedure stockee systeme!

  7. #7
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    décembre 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2003
    Messages : 397
    Points : 142
    Points
    142

    Par défaut



    Faut écrire un bout de code alors, je pensais trouver un bête menu dans SQL Server.

  8. #8
    Membre expérimenté

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : août 2007
    Messages : 1 216
    Points : 1 721
    Points
    1 721

    Par défaut

    Tu peux trouver un exemple de procedure la.
    http://www.sqlservercentral.com/scri...agement/30030/

    Ce site est très bien pour trouver des scripts ou lire des articles de SQL Pro en anglais... :p

  9. #9
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    décembre 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2003
    Messages : 397
    Points : 142
    Points
    142

    Par défaut

    Merci.

    EDIT : voir le dernier post !

    This script will kill all users in a given database. Before disconnecting, it can optionally send the user a NET SEND Message giving them a warning to disconnect. To run, simply call it like usp_killusers 'dbname'. Make sure the @dbname parameter is not the master database.
    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
    41
    42
    43
    44
    45
    CREATE PROCEDURE usp_KillUsers @dbname varchar(50) as
    SET NOCOUNT ON
     
    DECLARE @strSQL varchar(255)
    PRINT 'Killing Users'
    PRINT '-----------------'
     
    CREATE table #tmpUsers(
    spid int,
    eid int,
    status varchar(30),
    loginname varchar(50),
    hostname varchar(50),
    blk int,
    dbname varchar(50),
    cmd varchar(30))
     
    INSERT INTO #tmpUsers EXEC SP_WHO
     
     
    DECLARE LoginCursor CURSOR
    READ_ONLY
    FOR SELECT spid, dbname FROM #tmpUsers WHERE dbname = @dbname
     
    DECLARE @spid varchar(10)
    DECLARE @dbname2 varchar(40)
    OPEN LoginCursor
     
    FETCH NEXT FROM LoginCursor INTO @spid, @dbname2
    WHILE (@@fetch_status <> -1)
    BEGIN
    	IF (@@fetch_status <> -2)
    	BEGIN
    	PRINT 'Killing ' + @spid
    	SET @strSQL = 'KILL ' + @spid
    	EXEC (@strSQL)
    	END
    	FETCH NEXT FROM LoginCursor INTO  @spid, @dbname2
    END
     
    CLOSE LoginCursor
    DEALLOCATE LoginCursor
     
    DROP table #tmpUsers
    go

    Sinon dans les commentaires il y a plus simple (pas testé) :

    This is a much simpler way to get everyone out of the database:
    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
    -- Get rid of all DB users 
    use master
    alter database MyDatabase set offline with rollback immediate
     
     
    -- Bring DB back online in single user mode, and connect to DB
    alter database MyDatabase set online, single_user with rollback immediate
    use MyDatabase
     
    -- do stuff --
     
     
    -- Return DB to multi user mode
    use master
    alter database MyDatabase set multi_user with rollback immediate

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    novembre 2007
    Messages
    975
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2007
    Messages : 975
    Points : 486
    Points
    486

    Par défaut

    Bonjour,

    Il y a l'option"Deconnecter" via EntrepriseManager ou si pas de contraintes
    faire "Detacher" puis "Attacher"
    Cordialement,
    SDR.
    "ceux qui vivent, ce sont ceux qui luttent."

  11. #11
    Membre habitué
    Avatar de Peanut
    Profil pro
    Inscrit en
    décembre 2003
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2003
    Messages : 397
    Points : 142
    Points
    142

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    juillet 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2009
    Messages : 1
    Points : 1
    Points
    1

    Par défaut

    Une solution si vous avez tout testé
    (qu'un sp_detach ne marche pas car le verrou ne peut être mis, qu'une récupération n'aboutis pas...)
    A ne faire que si la récupération de vos données vous est inutile.

    D'abord exécuter cette commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    USE master
    SELECT * From master..sysaltfiles
    Et repérer où se trouve le fichier qui contient vos données [en repérant le nom de votre base]
    Arrêter tout les processus SQL (SQL SERVER, Services SQL etc...)
    Au pire redémarrer le PC

    Déplacer les fichiers trouvés avec la première commande

    Puis lancer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ALTER DATABASE mabase
    SET SINGLE_USER;
    USE master
    EXEC sp_detach_db 'mabase'
    GO
    J'espère que tout mon temps passé à trouver cette solution aidera quelqu'un

  13. #13
    Modérateur
    Avatar de elsuket
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    janvier 2005
    Messages
    5 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : janvier 2005
    Messages : 5 788
    Points : 11 868
    Points
    11 868

    Par défaut

    Bonjour,

    Le fait d'exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER DATABASE MyDatabase SET offline WITH rollback immediate
    Tout comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER DATABASE MyDatabase SET ONLINE
    Entraîne la perte du cache.
    Donc dès que les utilisateur pourront de reconnecter à la base de données, toutes les requêtes et procédures stockées qu'ils exécuteront seront recompilées, donc vous perdrez des performances ...

    Ce n'est pas le cas en exécutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER DATABASE maBD
    SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/07/2015, 10h28
  2. Pourquoi doit-on fermer les connexions sql ?
    Par thebloodyman dans le forum Persistance
    Réponses: 6
    Dernier message: 28/10/2009, 20h45
  3. Réponses: 2
    Dernier message: 21/03/2007, 16h26
  4. [SQL Server 2005] effacer les fichiers de backup
    Par psafp dans le forum Administration
    Réponses: 2
    Dernier message: 05/07/2006, 17h37
  5. sql server 2000/2005 les cubes
    Par schmur1 dans le forum MS SQL-Server
    Réponses: 23
    Dernier message: 03/04/2006, 11h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo