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 :

insertion automatique de la date de création d'un enreg / Date de modif


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut insertion automatique de la date de création d'un enreg / Date de modif
    Bonjour,

    Existe t il un attribut particulier sur les champs ou les tables permettant d'insérer automatique la date de création d'un enreg ainsi que la date de modif ?

    Quel est le meilleur moyen pour garder un historique des différentes valeurs d'une table ?

    D'avance merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut Création d'index par sécurité - regles de l'art
    Bonjour,

    J'ai une table qui contient deux champs pour lesquels je ne veux pas de doublons.
    D'un point de vue fonctionnel, l'appli est conçue pour ne jamais insérer des doublons dans ce couple de champ.

    Ceci dit, par sécurité, je voudrais créer un index sur ces deux champs (index unique), de sorte que ça claque une erreur en cas de bug dans l'appli (si cette derniere insere un doublon).

    Les index sont ils conçus pour répondre à ce genre de problématique ou bien est ce que je veux faire est est dehors des regles de l'art ?

    D avance merci

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Réponse à votre 1er post :

    Effectuez le test suivant :

    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
     
    CREATE TABLE TEST
    (
    	IDTest INT IDENTITY CONSTRAINT PK_TEST PRIMARY KEY,
    	val INT NOT NULL,
    	DateCreation DATETIME NOT NULL CONSTRAINT DF_TEST_DateCreation DEFAULT GETDATE(),
    	DateModification DATETIME
    )
    GO
     
    INSERT INTO dbo.TEST (val, DateModification) VALUES (1, GETDATE())
    WAITFOR DELAY '00:00:05'
    INSERT INTO dbo.TEST (val, DateModification) VALUES (2, GETDATE())
    WAITFOR DELAY '00:00:05'
    INSERT INTO dbo.TEST (val, DateModification) VALUES (3, GETDATE())
    GO
     
    SELECT *
    FROM dbo.TEST
    GO
     
    -- Maintient la date de modification
    CREATE TRIGGER TR_AU_TEST
    	ON dbo.TEST
    AFTER UPDATE
    AS
    BEGIN
    	UPDATE dbo.TEST
    	SET DateModification = GETDATE()
    	FROM dbo.TEST T
    	JOIN INSERTED I ON I.IDTest = T.IDTest
    END
    GO
     
    UPDATE dbo.TEST
    SET val = 8
    WHERE IDTest = 1
    GO
     
    SELECT *
    FROM dbo.TEST
    GO
    En conclusion :

    Existe t il un attribut particulier sur les champs ou les tables permettant d'insérer automatique la date de création d'un enreg
    Vous pouvez utiliser le type de de données TIMESTAMP je crois, mais je ne vous le conseille pas.
    Sinon vous pouvez faire comme je viens de vous le montrer, avec un contrainte de valeur par défaut.

    ainsi que la date de modif ?
    Avec un trigger, c'est le seul moyen de ne pas répéter le code de mise à jour de cette date dans toutes les procédures stockées qui effectuent des mises à jour sur cette table.

    Quel est le meilleur moyen pour garder un historique des différentes valeurs d'une table ?
    Vous pouvez créer une table d'annexe avec une clé étrangère référençant la table source, et une colonne de type DATETIME dans laquelle vous stockez toutes les dates de mise à jour avec un trigger.

    Réponse à votre 2nd post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE maTable
    ADD CONSTRAINT UQ_maTable_mesColonnes UNIQUE(colonne1, colonne2)
    GO

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Existe t il un attribut particulier sur les champs ou les tables permettant d'insérer automatique la date de création d'un enreg ainsi que la date de modif ?
    Rien n'existe par défaut dans une base de données relationnelle. Vous devez donc mettre dans les tables ce sont vous avez besoin.
    Donc dans votre cas, vous devez rajouter une colonne de type DATETIME avec comme valeur par défaut CURRENT_TIMESTAMP ce qui l'alimentera avec la date/heure de création de la ligne. (il n'y a pas "d'enregistrements " dans une base de données, nous n'en somme plus au temps des "fichiers")

    Quel est le meilleur moyen pour garder un historique des différentes valeurs d'une table ?
    Historiser dans une table d'historisation via un trigger.
    Lisez l'article que j'ai écrit à ce sujet : http://www.sqlspot.com/Historisation-des-donnees.html

    J'ai une table qui contient deux champs pour lesquels je ne veux pas de doublons. D'un point de vue fonctionnel, l'appli est conçue pour ne jamais insérer des doublons dans ce couple de champ.
    Ceci dit, par sécurité, je voudrais créer un index sur ces deux champs (index unique), de sorte que ça claque une erreur en cas de bug dans l'appli (si cette derniere insere un doublon).
    Les index sont ils conçus pour répondre à ce genre de problématique ou bien est ce que je veux faire est est dehors des regles de l'art ?
    Un index sert à accélérer les recherches. Il ne sert à rien dans ce cas précis. En revanche il vous faut ajouter une contrainte d'unicité. Lisez ce que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/s...partie2#L7.2.2

    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/ * * * * *

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    Merci pour vos réponse.

    Interessant d'utiliser les triggers pour faire une table d'historisation.

    Cependant, existe t il un moyen de se débrouiller avec la log binaire pour retrouver l'historique ?
    Est ce propre ?

    A+

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous voulez lire le journal de transactions pour gérer cela ?
    C'est de la pure folie, et c'est pourquoi MS ne fournit aucun outil permettant de lire le journal des transactions.
    Il en existe des payants, mais leur utilisation n'est pas garantie par leurs éditeurs.

    @++

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    Quel est le role des logs alors ?
    Je pensais qu'on pouvait reconstituer la base de données jusqu'a une date t à partir de ces logs. Est ce exact ?

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Le rôle du journal des transactions est celui que vous venez de décrire, c'est-à-dire d'assurer la cohérence transactionnelle de la base de données en enregistrant les modifications exécutées sur la base de données avant même que celles-ci soient réellement opérées.
    De cette façon on peut faire, refaire ou défaire une transaction après un crash.

    Je pensais qu'on pouvait reconstituer la base de données jusqu'a une date t à partir de ces logs. Est ce exact ?
    C'est exact, mais vous aurez pour cela besoin au moins d'un backup complet de la base de données et d'un backup du journal de transaction courant.
    La restauration se fait alors avec la commande RESTORE et son option STOPAT.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    ok merci pour les réponses.

    La solution des triggers me bote bien mais petit Quid: J'aimerais également mémoriser quel utilisateur a fait telle ou telle modif.
    Ma notion d'utilisateur est une notion purement interne (j'ai fait ma propre table des users).
    Du coup, existe t il une solution ?...

    D'avance merci

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Si vous utilisateurs sont des acteurs de votre entreprise, il vous suffit de créer des utilisateurs de vos bases de données.
    Dès lors vous pouvez récupérer l'utilisateur qui exécute la procédure stockée avec la fonction système SUSER_NAME().

    Si ce sont vos clients, il vous faut alors les enregistrer dès qu'ils se connectent à l'application un identifiant que vous passez à la procédure stockée qui modifie votre table source.
    Vous n'aurez alors qu'à lire cet identifiant dans la table virtuelle INSERTED dans le trigger pour l'insérer dans votre table d'historique.

    @++

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 202
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    Je n'ai pas bcp de users donc effectivemenent, je peux les créer dans sql server.

    Est il pertinent d'utilser les users créés au niveau base pour l'authentification sur l'application elle même.
    Existe t il des requetes permettant de créer de nouveaux users afin que je puisse automatiser la chose ?

    Autre chose, j'utilise linq dans mon appli.
    Je sais qu'avant de faire un submitchanges(), on peut demander a linq la liste des elements qui vont etre changés.
    Existe t il un moyen d automatisation au niveau appli ?

    Merci d'avance

  12. #12
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Est il pertinent d'utilser les users créés au niveau base pour l'authentification sur l'application elle même.
    C'est à vous de voir, le mieux à mon sens est de créer une connexion pour votre application (niveau instance) et un utilisateur (qui est en fait l'application) sur la base de données concernée.

    Existe t il des requetes permettant de créer de nouveaux users afin que je puisse automatiser la chose ?
    Au démarrage de votre application, vous demandez à l'utilisateur un login et un mot de passe.
    Si l'utilisateur existe dans votre table d'utilisateurs, vous vous retournez l'identifiant de cet utilisateur.
    S'il n'existe pas vous l'insérez, et de même vous vous retournez l'identifiant de cet utilisateur.

    Existe t il un moyen d automatisation au niveau appli ?
    C'est-à-dire ?
    Faites plutôt cela dans une procédure stockée dans la base de données, et appelez-là avec LINQ

    @++

Discussions similaires

  1. Parser une date suivi d'un fuseaux horaire (date+02:00) et conversion en Date.
    Par SpeedOverflow dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 30/06/2013, 13h37
  2. Réponses: 3
    Dernier message: 21/07/2010, 09h53
  3. insertion automatique de la date du jour
    Par hugue dans le forum Access
    Réponses: 2
    Dernier message: 23/01/2007, 11h35
  4. Réponses: 3
    Dernier message: 03/11/2006, 15h30
  5. Réponses: 6
    Dernier message: 03/10/2006, 09h00

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