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 :

triggers crée un lock [2014]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut triggers crée un lock
    Bonjour,

    j'en perds mon latin. J'essaie d'implémenter une table d'audit. J'ai:

    table audit_log

    Table A et table B

    A et B ont un trigger qui en cas d'insert ou delete, font un insert dans audit_log, du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into audit_log (x, y, z) select x, y, z from inserted where macolonne is not null;
    je découvre que le select x,y,z from inserted (ou deleted) crée un lock et donc je ne peux pas insérer dans A dans une transaction 1 et insérer dans B dans une transaction 2 en même temps, il faut que la transaction 1 soit commitée pour que la 2 puisse finir.

    Pour info, la db n'est pas en RCSI.

    help ! je ne comprends pas ce qui se passe. si j'enlève le select from inserted et le remplace par un "values (x,y,z)" je n'ai pas ce problème ... (sauf que je ne peux pas ...)

    avez vous une idée ?

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Citation Envoyé par epsilon68 Voir le message
    Bonjour,
    je decouvre que le select x,y,z from inserted (ou deleted) crée un lock et donc je ne peux pas inserer dans A dans une transaction 1 et inserer dans B dans une transaction 2 en meme temps, il faut que la transaction 1 soit commitée pour que la 2 puisse finir.
    avez vous une idée ?
    Vu de loin, je ne vois pas le problème. Tes insertions provenant de 2 transactions distinctes dans la table d'audit seront sérialisés comme attendu. Si tes transactions sont courtes et sélectives le verrou ne devrait pas plus déranger que cela.

    Est-ce le cas ?

    ++

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    j'ai trouvé mon problème, en fait je faisais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with mes_ids (select id from matable order by id fetch next 10 rows only)
    delete from matable where id in (Select id from mes_ids)
    le select dans le with, faisait en fait le lock...

    ca m'a quand même fait perdre quelques heures cette histoire...

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 602
    Billets dans le blog
    10
    Par défaut
    Donc le but de ce trigger est de supprimer physiquement les lignes dont la valeur d'identifiant fait partie des 10 plus petites valeurs, ce qui ne veut pas forcément dire qu'il s'agit des plus anciens.
    Etrange de faire des DELETE sans critère fonctionnel... quel est le contexte ?

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Donc le but de ce trigger est de supprimer physiquement les lignes dont la valeur d'identifiant fait partie des 10 plus petites valeurs, ce qui ne veut pas forcément dire qu'il s'agit des plus anciens.
    Etrange de faire des DELETE sans critère fonctionnel... quel est le contexte ?
    non, le but du trigger est de logger les valeurs lors de l'insert, update et delete. C'est un trigger pour auditer les données.
    Le "delete from" que je faisais était pour tester le trigger, et je voulais effacer seulement n lignes... mais je me suis tiré dans le pied.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Ce n'est pas avec un déclencheur que l'on audite. C'est avec le DATABASE AUDIT !

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

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Pour information, vous pourriez probablement faire plus simple en mettant en place le CHANGE TRACKING

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

Discussions similaires

  1. Crée un trigger (INSERT/DELETE/UPDATE) paramètré
    Par Sergejack dans le forum Contribuez
    Réponses: 0
    Dernier message: 15/09/2009, 12h05
  2. Probleme de lock sur un trigger after insert
    Par funboard dans le forum Oracle
    Réponses: 5
    Dernier message: 04/03/2009, 12h14
  3. Réponses: 4
    Dernier message: 03/09/2008, 01h44
  4. pbm avec un trigger crée
    Par tsague dans le forum PL/SQL
    Réponses: 5
    Dernier message: 01/02/2008, 10h28
  5. Réponses: 5
    Dernier message: 25/04/2006, 01h02

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