IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Nouvelles tables accidentelles


Sujet :

Développement SQL Server

  1. #1
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut Nouvelles tables accidentelles
    Bonjour tout le monde,

    Il y a peu, après avoir réinstallé SQL Express 2014, j'ai installé la base NorthWind.
    J'ai lancé le script deux ou trois fois, et je ne voyais rien apparaître.

    C'est ensuite que je me suis rendu compte que j'étais supposé lire le début avant exécution : "Ce script ne crée pas de base de données. Sélectionnez la base dans laquelle vous voulez créer les tables et autres objets."

    Aussi je viens d'avoir une surprise :
    Nom : Table Master Capture d'écran 2024-02-07 143508.png
Affichages : 204
Taille : 40,1 Ko

    Sans trop savoir pourquoi, je me dis plus ou moins intuitivement que la table master de SQL Server n'est pas supposée connaître de clients, d'employés ni de commandes.

    Qu'est-ce que je dois laisser, dedans ?

    J'ose espérer que ça ne m'oblige pas à tout réinstaller ?

    (C'est "amusant" : quand j'ai téléchargé la copie d'écran, l'aperçu a fait apparaître les noms de tables dans une très grosse police ; or, après publication je vois que c'est tout petit. Ah oui c'est parce que ça s'adapte à la largeur de la fenêtre dans laquelle ça s'affiche.)

  2. #2
    Membre chevronné Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 547
    Par défaut
    Je te rassure, ça nous ait tous arrivé de créer accidentellement de quoi dans master !
    Normalement, il ne devrait pas y avoir de tables visibles dans master.

    Pour voir les objets que ton script a créé dans master, tu peux regarder les objets qui ont été créé à l'heure où tu as lancé ton script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from sys.all_objects order by create_date desc
    Cela dit, ces objets n'auront pas d'impact sur le bon déroulement de l'instance. Si tu n'es pas sûr de ton coup dans la suppression des objets, laisse ça là, surtout si c'est pas de la production.

  3. #3
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut
    Ah bien vu, merci.
    Du coup il ne me reste plus qu'à écrire un script pour détruire ce qui a été créé ce jour-là, tables, procédures stockées, enfin tout le bazar.
    C'est mieux de ne pas trop tarder, comme ça en cas de loupé je n'ai presque rien de perdu, juste ce que j'ai restauré depuis l'installation.

    Je me vois bien faire ça en C#, encore que PowerShell serait un bon candidat aussi semble-t-il.

  4. #4
    Membre chevronné Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 547
    Par défaut
    Citation Envoyé par Gluups Voir le message
    Je me vois bien faire ça en C#, encore que PowerShell serait un bon candidat aussi semble-t-il.
    Pourquoi ne pas faire ça simplement en T-Sql, quitte à travailler dans une bd ? Ça me semble le plus simple !
    DROP TABLE dbo.nomTable
    DROP PROCEDURE dbo.Proc...

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par AaâÂäÄàAaâÂäÄàAaâÂäÄ Voir le message
    Je te rassure, ça nous ait tous arrivé de créer accidentellement de quoi dans master !
    Normalement, il ne devrait pas y avoir de tables visibles dans master.

    Pour voir les objets que ton script a créé dans master, tu peux regarder les objets qui ont été créé à l'heure où tu as lancé ton script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from sys.all_objects order by create_date desc
    Cela dit, ces objets n'auront pas d'impact sur le bon déroulement de l'instance. Si tu n'es pas sûr de ton coup dans la suppression des objets, laisse ça là, surtout si c'est pas de la production.

    Non ! Pas all_objecxts qui cumule les entrées de master et des bases locales avec les tables système...

    Toujours utiliser INFORMATION_SCHEMA.TABLES et INFORMATION_SCHEMA.ROUTINES

    Qui indique les objets uitilisateurs seulement...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut
    Citation Envoyé par AaâÂäÄàAaâÂäÄàAaâÂäÄ Voir le message
    Pourquoi ne pas faire ça simplement en T-Sql, quitte à travailler dans une bd ? Ça me semble le plus simple !
    DROP TABLE dbo.nomTable
    DROP PROCEDURE dbo.Proc...
    Effectivement c'est intéressant, ça reste plus dans le domaine. Il va falloir que je m'accroche un peu plus, par exemple.

    (Il y a des histoires de mails d'alerte qui m'agacent un chouïa.)

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Gluups Voir le message
    Ah bien vu, merci.
    Du coup il ne me reste plus qu'à écrire un script pour détruire ce qui a été créé ce jour-là, tables, procédures stockées, enfin tout le bazar.
    C'est mieux de ne pas trop tarder, comme ça en cas de loupé je n'ai presque rien de perdu, juste ce que j'ai restauré depuis l'installation.

    Je me vois bien faire ça en C#, encore que PowerShell serait un bon candidat aussi semble-t-il.
    Il faut d'abord supprimer les contraintes FOREIGN KEY...

    Le moyen le plus simple est d'utiliser du SQL !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @SQL NVARCHAR(max) = N'';
    SELECT @SQL = @SQL + 'ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + '];'
    FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE  CONSTRAINT_TYPE = 'FOREIGN KEY'
    EXEC (@SQL);
    SET @SQL = N'';
    SELECT @SQL = @SQL + 'DROP TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '];'
    FROM   INFORMATION_SCHEMA.TABLES
    EXEC (@SQL);
    Il faudra aussi faire cela pour les objets de code : Procédure, fonctions....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Non ! Pas all_objecxts qui cumule les entrées de master et des bases locales avec les tables système...

    Toujours utiliser INFORMATION_SCHEMA.TABLES et INFORMATION_SCHEMA.ROUTINES

    Qui indique les objets uitilisateurs seulement...

    A +
    Ah effectivement, c'est bien d'être précis, merci.
    Dans ce cas-ci on arrivera au même résultat car au moment de tenter de créer la base NorthWind je n'ai rien modifié d'autre, mais ça, ça ne sera pas forcément vrai à chaque coup.

  9. #9
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Il faudra aussi faire cela pour les objets de code : Procédure, fonctions....
    En effet, j'avais bien repéré ça.
    Sinon une dizaine de clics, puis appui sur suppression et envoi, ça devrait aller plus vite.

  10. #10
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut
    Je dois avouer que pour quelqu'un qui voulait faire vite je charrie un peu ...

    select * from INFORMATION_SCHEMA.TABLES

    Bon il y e n a 17 :
    master dbo VIEW Alphabetical list of products
    master dbo VIEW Current Product List
    master dbo VIEW Orders Qry
    master dbo VIEW Products Above Average Price
    master dbo VIEW Products by Category
    master dbo VIEW Quarterly Orders
    master dbo VIEW Invoices
    master dbo VIEW Order Details Extended
    master dbo VIEW Order Subtotals
    master dbo VIEW Product Sales for 1997
    master dbo VIEW Category Sales for 1997
    master dbo VIEW Sales by Category
    master dbo VIEW Sales Totals by Amount
    master dbo VIEW Summary of Sales by Quarter
    master dbo VIEW Summary of Sales by Year
    master dbo VIEW spt_values
    master dbo VIEW Customer and Suppliers by City

    Vachement simple à taper, comme requête,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM [Alphabetical list of products]
    Coup de pot il n'y a pas une table "Alphabetical list of products that were not commanded in the first quarter and are not sold out".

    J'ai changé l'ordre des colonnes, parce que VIEW à la fin faisait de méchants zig-zags. Il y a un outil tableau, sur le forum, mais qui met toute la table dans la même cellule.

    Maintenant, j'ai l'impression que j'ai intérêt à éplucher ça à la main, parce des tables doivent rester sur master, et ... logiquement elles doivent être dans la liste.

  11. #11
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut
    Alors donc, même si c'est dans SCHEMA_TABLES, comme l'indique la colonne que j'ai citée en troisième, ce sont des vues, et j'ai pu supprimer la première comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    USE master
    GO
    DROP VIEW [Alphabetical list of products]
    GO
    et maintenant, il reste à faire la même chose en remplaçant le nom de vue par chacune des suivantes.
    Donc là, de choses l'une, soit je sélectionne toute la liste et j'appuie sur Suppression, soit j'essaie d'automatiser un peu, pour le cas où je voudrais introduire une exception.

    Histoire d'apprendre un peu quelque chose, creusons voir la deuxième filière.

    Comme je disais, en C# ou en PowerShell on doit pouvoir avancer avec ForEach, mais si je regarde la doc, en TSQL sur ForEach on trouve surtout des exemples pour parcourir un intervalle de dates.

    Il doit bien y avoir moyen de parcourir un jeu d'enregistrements ?
    Si c'est bien comme ça qu'on appelle des résultats en sortie d'une requête SQL ..

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Je vous ais donné la solution ici:
    https://www.developpez.net/forums/d2.../#post12002857
    Il suffit de lire !

    Petite question : quand vous vous habillez, vous mettez une couche culotte puis par dessus un slip et enfin votre pantalon et puis un sur pantalon pour être à l'aise ?

    Alors pourquoi rajouter des couches du style C# ou powershell qui complexifie la chose et la rendre moins performante et moins maniable ???

    Vous devez utiliser PowerShell lorsque les actions a effectuer nécessite des accès au système exploitation en sus des opérations de BD...
    Vous devez utiliser C# lorsqu'il y a nécessité d'interagir avec des utilisateurs lambda au travers de couches graphiques....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  13. #13
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 747
    Par défaut
    C'est ma foi vrai, et pour voir ce que ça a dans les tripes, remplacer EXEC(@SQL) par SELECT(@SQL);

    Ensuite remplacer DROP TABLE par DROP VIEW, puisque ce sont des vues qui restent.

    Du coup je suppose qu'à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @SQL = @SQL + 'DROP TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '];'
    FROM   INFORMATION_SCHEMA.TABLES
    On pouvait mettre, en deux fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @SQL = @SQL + 'DROP TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '];'
    FROM   INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'TABLE'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @SQL = @SQL + 'DROP VIEW [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '];'
    FROM   INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW'
    et ensuite il me reste les procédures stockées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @SQL NVARCHAR(max) = N'';
    SELECT @SQL = @SQL + 'DROP STORED_PROCEDURE [' + SPECIFIC_SCHEMA + '].[' + SPECIFIC_NAME + '];'
    FROM   INFORMATION_SCHEMA.ROUTINES;
    SELECT @SQL;
    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP STORED_PROCEDURE [dbo].[Sales by Year];
    DROP STORED_PROCEDURE [dbo].[CustOrdersDetail];
    DROP STORED_PROCEDURE [dbo].[CustOrdersOrders];
    DROP STORED_PROCEDURE [dbo].[CustOrderHist];
    DROP STORED_PROCEDURE [dbo].[SalesByCategory];
    DROP STORED_PROCEDURE [dbo].[sp_MSrepl_startup];
    DROP STORED_PROCEDURE [dbo].[sp_MScleanupmergepublisher];
    Ah oui mais sauf que attention les deux dernières datent de 2014, donc il faut les laisser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @SQL NVARCHAR(max) = N'';
    SELECT @SQL = @SQL + 'DROP STORED_PROCEDURE [' + SPECIFIC_SCHEMA + '].[' + SPECIFIC_NAME + '];'
    FROM   INFORMATION_SCHEMA.ROUTINES WHERE YEAR(CREATED) = 2024;
    SELECT @SQL;
    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DROP PROCEDURE [dbo].[Ten Most Expensive Products];
    DROP PROCEDURE [dbo].[Employee Sales by Country];
    DROP PROCEDURE [dbo].[Sales by Year];
    DROP PROCEDURE [dbo].[CustOrdersDetail];
    DROP PROCEDURE [dbo].[CustOrdersOrders];
    DROP PROCEDURE [dbo].[CustOrderHist];
    DROP PROCEDURE [dbo].[SalesByCategory];
    et du coup je peux remplacer SELECT(@SQL) par EXEC(@SQL).

    (L'opération est simplifiée parce que l'installation vient juste d'avoir lieu, donc en plus de ce qu'il y avait au départ il y a les contenus de NorthWind, installé récemment, donc en 2024. Sinon, j'ai eu un jour à sélectionner à une heure donnée, il fallait un segment de deux secondes.)

    Si je ne m'abuse avec ça ça devrait être propre, merci.

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Yes !!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/10/2006, 09h51
  2. Réponses: 16
    Dernier message: 09/10/2006, 10h12
  3. Réponses: 6
    Dernier message: 27/08/2006, 18h57
  4. Nouvelle Table Bizarre
    Par Abdou1 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/07/2006, 14h55
  5. pb avec la requête "création d'une nouvelle table"
    Par fab4_33 dans le forum Access
    Réponses: 4
    Dernier message: 03/02/2006, 17h37

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