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 :

Probleme avec un trigger


Sujet :

Développement SQL Server

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Par défaut Probleme avec un trigger
    Bonjour,

    Je voudrais utiliser un trigger pour executer une procedure stockée à chaque insertion de ligne dans ma table.
    Le trigger est sur SQL server 2005 et j'ai fais ma procedure stockée avec visual studio 2005.
    Ma procedure stockée fonctionne quand je l'execute depuis visual studio ou encore quand je l'execute depuis SQL server (management studio express) mais quand je passe par le trigger, rien!
    De plus mon but, si ça peut aider quelqu'un, est de faire passer une image d'une base ACCESS sur une base SQL, ma procedure stockée le fait très bien.

    Voici mon trigger:
    DECLARE @project_id int, @elevation_id int, @error int
    DECLARE @source varchar(512)
    SET @source = 'Data Source=OPW2000P\SQLEXPRESS;Initial Catalog=ChacalPAR;Integrated Security=True'
    SET @error = 0
    BEGIN TRAN
    DECLARE curseurbtblElevationinsert CURSOR FOR SELECT PtrIdProjet, iIdElevation FROM inserted

    OPEN curseurbtblElevationinsert

    FETCH NEXT FROM curseurbtblElevationinsert INTO @project_id, @elevation_id

    WHILE (@@FETCH_STATUS = 0) AND (@error = 0)
    BEGIN

    IF (ISNULL(@project_id,0) > 0) AND (ISNULL(@elevation_id,0) > 0)
    BEGIN
    EXECUTE [dbo].[MaStoredProcedure2] @project_id, @elevation_id, @source

    SET @error = @error + @@ERROR
    END
    FETCH NEXT FROM curseurbtblElevationinsert INTO @project_id, @elevation_id

    END
    CLOSE curseurbtblElevationinsert
    DEALLOCATE curseurbtblElevationinsert
    IF @error=0 COMMIT TRAN ELSE ROLLBACK TRAN

    Ainsi si quelqu'un peut me dire d'où vient mon problème ce serait super sympa.
    Si vous voulez d'autre parti de mon code demandez le moi sans hésiter.
    Merci

  2. #2
    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 : 44
    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
    Par défaut
    Bonjour,

    Question simple et probablement bête: ta procédure stockée existe-t-elle bien dans l'Object Explorer ?
    Quel est le type de ton trigger (AFTER INSERT ou autre ... ?)

    Possible de voir le code de la procédure Visual ?

    A+

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Par défaut RE,
    bonjour,
    Mon trigger est un insert
    Voici tout le code de ma procedure stockée si cela peu t'aidé :
    Partial Public Class StoredProcedures

    <Microsoft.SqlServer.Server.SqlProcedure()> _
    Public Shared Sub MaStoredProcedure(ByVal projet As Integer, ByVal elevation As Integer, ByVal source As String)
    Using maConnexion As New SqlConnection("context connection = true")

    Dim conn As New OleDbConnection
    Dim requete As String = "SELECT tbl_Elevation.binWmf FROM (tbl_Elevation) WHERE (((tbl_Elevation.PtrIdProjet)=" & projet & ") AND ((tbl_Elevation.lIdCompteur)=" & elevation & "))"

    Try
    conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;data source=" & source
    conn.Open()
    Dim cmd As OleDbCommand = New OleDbCommand(requete, conn)
    Dim odatareader As OleDbDataReader = cmd.ExecuteReader()
    Dim list As ArrayList = New ArrayList()
    If odatareader.HasRows Then
    Do While odatareader.Read()
    If Not odatareader.IsDBNull(0) Then
    Update(projet, elevation, odatareader(0))
    End If
    Loop
    End If
    odatareader.Close()
    SqlContext.Pipe.Send("1")
    Catch ex As Exception
    'Error handling
    SqlContext.Pipe.Send("-1")
    Finally
    conn.Close()
    End Try

    End Using
    ' Ajoutez ici votre code
    End Sub

    Public Function Update(ByVal projet As Integer, ByVal elevation As Integer, ByVal img As Object) As Object
    Using maConnexion As New SqlConnection("context connection = true")
    Try
    'Dim connstring As String = "Data Source=OPW2000P\SQLEXPRESS;Initial Catalog=ChacalSAI;Integrated Security=True"
    'Dim myConnection As SqlConnection = New SqlConnection(connstring)
    Dim myCommand As SqlCommand = New SqlCommand("Procedure_Update", maConnexion)
    Dim idReturn As Integer = -1

    myCommand.CommandType = CommandType.StoredProcedure

    Dim myParameter As SqlParameter = myCommand.Parameters.Add("@projet", SqlDbType.Int)
    myParameter.Direction = ParameterDirection.Input
    myParameter.Value = projet

    myParameter = myCommand.Parameters.Add("@elevation", SqlDbType.Int)
    myParameter.Direction = ParameterDirection.Input
    myParameter.Value = elevation

    myParameter = myCommand.Parameters.Add("@img", SqlDbType.Image)
    myParameter.Direction = ParameterDirection.Input
    myParameter.Value = img

    myParameter = myCommand.Parameters.Add("RETURN_VALUE", SqlDbType.Int)
    myParameter.Direction = ParameterDirection.ReturnValue

    'Open connection
    maConnexion.Open()

    Dim myreader As SqlDataReader = myCommand.ExecuteReader()
    idReturn = CInt(myCommand.Parameters("RETURN_VALUE").Value)
    maConnexion.Close()
    Return idReturn

    Catch ex As Exception
    Return -1
    End Try
    End Using
    End Function
    End Class

    Mais pour moi le problème ne vien pas du code ( je peux me tromper bien sur ) je me demande si le problème ne vient pas du fait que je vais chercher des données (l'image) dans une base access et que j'essai de les importer dans SQL ou un truc comme ça.
    Mais bon c'est un peu bete car quand je lance tt sa depuis visual sa marche donc je suis perdu.
    Enfin bon pour ce recentrer sur le sujet c'est lorsque j'insere une ligne dans ma base SQL et que le trigger devrai executer la procedure stockée qui ne marche pas.
    Merci à ce qui s'investisse sur mon casse tête

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    A l'origine votre trigger est déjà faux : en effet un trigger SQL Server est déjà dans la transaction, votre begin transactiopn n'a donc aucun effet et les commit ou rollback que vous pouvez faire pertuberons la chose plutôt que de faire quelquechose d'efficace.

    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
    SELECT COALESCE(PtrIdProjet,0) AS PtrIdProjet, 
           COALESCE(iIdElevation, 0) AS iIdElevation, 
           0 AS Done
    INTO   #T
    FROM   inserted
     
    DECLARE @source VARCHAR(256), @PtrIdProjet INT, @iIdElevation INT
    SET     @source = 'Data Source=OPW2000P\SQLEXPRESS;Initial Catalog=ChacalPAR;Integrated Security=True' AS Source   
     
    WHILE EXISTS(SELECT *
                 FROM   #T
                 WHERE  Done = 0)
    BEGIN
     
       SELECT TOP 1 @PtrIdProjet = PtrIdProjet, @iIdElevation = iIdElevation
       FROM   #T
       WHERE  Done = 0
     
       EXECUTE dbo.MaStoredProcedure2 @PtrIdProjet, @iIdElevation, @source
       IF @@ERROR GOTO LBL_ERROR
     
       UPDATE #T
       SET    Done = 1
       WHERE  PtrIdProjet = @PtrIdProjet,
              iIdElevation =  @iIdElevation
       IF @@ERROR GOTO LBL_ERROR
     
    END
     
    RETURN
     
    LBL_ERROR:
    ROLLBACK
    Voila votre trigger rectifié.

    Pour votre proc stock pourquoi ne pas utiliser du transact SQL ?

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

Discussions similaires

  1. probleme avec le trigger
    Par kanebody dans le forum InterBase
    Réponses: 1
    Dernier message: 04/01/2010, 08h20
  2. problemes avec les triggers.
    Par bouba69 dans le forum SQL
    Réponses: 42
    Dernier message: 16/03/2008, 21h25
  3. probleme avec un trigger
    Par shaftmanpro2 dans le forum Forms
    Réponses: 2
    Dernier message: 04/03/2008, 18h34
  4. Probleme avec mon trigger
    Par parrain27 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/05/2007, 12h10
  5. probleme avec le trigger STOCK
    Par madmax-mad dans le forum Oracle
    Réponses: 2
    Dernier message: 25/01/2007, 10h08

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