none
creazione di un trigger RRS feed

  • Domanda

  • ragazzi scusate l'ignoranza ma ho bisogno di un esempio di query sql semplice che inserisce dei valori indicati in source in una nuova riga di una un'altra tabella situata in un altro database della stessa istanza
    martedì 29 maggio 2012 19:11

Risposte

  • nessuno è nato "imparato".. non preoccuparti !!! ;-)

    Se oltre ai dati prelevati da inserted devi inserire anche dei dati preimpostati sulla stessa riga ti basta fare :

    Insert into TBL_ACCOUNT (Fld_loginId,Fld_password, campo_1, campo_2..., campo_n) Select username,password, Valore_Campo_1, Valore_Campo_2...., valore_campo_n from inserted 

    dove valore_campo_1 etc sono i tuoi dati preimpostati. 

    In questo modo con una sola istruzione inserisci nella tabella i dati che stai inserendo prelevandoli dalla inserted ed integrandoli con i dati preimpostati.

    Lo stesso ragionamento lo puoi riprodurre sulle altre tabelle coinvolte nel trigger.

    Ciao

    Luca


    Luca Ferrari http://tipsandtrickssqlserver.blogspot.com/

    mercoledì 30 maggio 2012 19:17

Tutte le risposte

  • sono andato avanti

    [code]

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================

    -- =============================================
    CREATE TRIGGER dbo.usercopy 
       ON  dbo.mws_users 
       AFTER INSERT
    AS 
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

        INSERT INTO test.dbo.Table_1 (username, password)
        VALUES ('value1', 'value2')

    END
    GO[/code]

    quindi con questa query se creo un nuovo utente su joomla automaticamente scrive nella tabella Table_1 i valori 'value1' e 'value2'? giusto?.

    Se invece volessi riportare i dati inseriti nelle tables di joomla con la registrazione come devo fare?

    martedì 29 maggio 2012 20:07
  • Ciao,

    se non ho capito male vorresti inserire in table_1, che risiede in un'altro db, i valori inseriti nella tabella dbo.mws_user

    create trigger LogTrigger
    on [dbo].[dbo.mws_user]
    after Insert
    as
    INSERT INTO test.dbo.Table_1 (username, password)
    Select username, password from inserted

    Il trigger creato ora inserisce i dati reali prelevandoli dalla tabella inserted, che contiene SOLO le righe che stai inserendo.

    Leggi qui per maggiori info sulle tabelle inserted e deleted

    Ciao

    Luca



    Luca Ferrari http://tipsandtrickssqlserver.blogspot.com/

    martedì 29 maggio 2012 20:47
  • ok si e' quello che cercavo il debug e ok e dovrebbe funzionare solo che ora ottengo il seguente errore

    Registration failed: Registration failed: jtableuser: :store failed
    [Microsoft][SQL Server Native Client 10.0][SQL Server]The server principal "joomlauser" is not able to access the database "test" under the current security context.SQL=INSERT INTO [mws_users] ([name],[username],[email],[password],[usertype],[block],[sendEmail],[registerDate],[lastvisitDate],[activation],[params]) VALUES (N'terer',N'asdfg001',N'spliffsurviver@hotmail.com',N'e2d37b4b3998b4b50b47819dc1c95130:n4RQoVlcHh74O1NB45Zvho6QObxxkZ49',N'',N'1',N'0',N'2012-05-29 22:43:42',N'',N'0038f0f938df3c42bd02798960caa6f3',N'{}')

    come posso settare i permessi al database affinche' l'account utente che utilizza il sito possa modificare solo quella determinata tabella?

    OK adesso mi manca la parte dell'update account in questo caso ditemi se sbaglio devo creare un trigger dml per gestire piu' righe di dati perche' l'update non e' detto che utilizzi sempre la nuova riga. e qui mi vengono 2 domande:

    1-Mi conviene modificare il trigger esistente o posso crearne tranquillamente un altro analogo? non rischio conflitto?

    2- che statement mi consigliate per ottimizzare il procedimento? sono sulla giusta strada?

    martedì 29 maggio 2012 22:50
  • ok ho messo i permessi all'utente joomlauser e ora ottengo questo altro errore:

    Registration failed: Registration failed: jtableuser: :store failed
    [Microsoft][SQL Server Native Client 10.0][SQL Server]String or binary data would be truncated.SQL=INSERT INTO [mws_users] ([name],[username],[email],[password],[usertype],[block],[sendEmail],[registerDate],[lastvisitDate],[activation],[params]) VALUES (N'Livio',N'asdf001',N'test@test.test',N'62f2735b760ba1c4262413f2dd73568c:9XjxCbV4vDK9bNhDSbcdJp9DCAb50gS3',N'',N'1',N'0',N'2012-05-29 23:03:56',N'',N'ab0d76a5ed95c0971eeebf35bae43f1c',N'{}')

    rimangono sempre 3 domande:

    1-Mi conviene modificare il trigger esistente o posso crearne tranquillamente un altro analogo? non rischio conflitto?

    2-che statement mi consigliate per ottimizzare il procedimento? sono sulla giusta strada?

    3-Come si vede nell'errore a quanto pare il fatto che joomla mandi una password criptata al database non ha niente a che vedere con il server sql?

    martedì 29 maggio 2012 23:06
  • ok ho messo i permessi all'utente joomlauser e ora ottengo questo altro errore:

    Registration failed: Registration failed: jtableuser: :store failed
    [Microsoft][SQL Server Native Client 10.0][SQL Server]String or binary data would be truncated.SQL=INSERT INTO [mws_users] ([name],[username],[email],[password],[usertype],[block],[sendEmail],[registerDate],[lastvisitDate],[activation],[params]) VALUES (N'Livio',N'asdf001',N'test@test.test',N'62f2735b760ba1c4262413f2dd73568c:9XjxCbV4vDK9bNhDSbcdJp9DCAb50gS3',N'',N'1',N'0',N'2012-05-29 23:03:56',N'',N'ab0d76a5ed95c0971eeebf35bae43f1c',N'{}')

    rimangono sempre 3 domande:

    1-Mi conviene modificare il trigger esistente o posso crearne tranquillamente un altro analogo? non rischio conflitto?

    2-che statement mi consigliate per ottimizzare il procedimento? sono sulla giusta strada?

    3-Come si vede nell'errore a quanto pare il fatto che joomla mandi una password criptata al database non ha niente a che vedere con il server sql?

    L'errore segnalato indica che una colonna char o varchar ha una dimensione inadeguata a contenere i dati che stai tentando di inserire. Verifica quindi che le dimensioni delle siano corrette.

    Domanda 1/2

    Perchè vorresti creare un ulteriore trigger ? La tabella inserted contiene già TUTTE le righe di cui stai effettuando l'insert.

    Domanda 3

    In teoria no, l'importante è che la dimensione della colonna password sia adeguata.

    Ciao


    Luca Ferrari http://tipsandtrickssqlserver.blogspot.com/

    mercoledì 30 maggio 2012 07:42
  • questo e' l'errore che mi da adesso dopo aver riscritto le tabelle

                   

    Registration failed: Registration failed: jtableuser: :store failed
    [Microsoft][SQL Server Native Client 10.0][SQL Server]Conversion failed when converting date and/or time from character string.SQL=INSERT INTO [mws_users] ([name],[username],[email],[password],[usertype],[block],[sendEmail],[registerDate],[lastvisitDate],[activation],[params]) VALUES (N'Ismaila',N'Ulquiorra',N'test2@test.test',N'd48cf15153451295f1818bd2c7080245:Jat6OjMR08J5ddalk34AmCsQ5hEGQ4EW',N'',N'1',N'0',N'2012-05-30 16:29:01',N'',N'ef14199f76db2c5c791a8bc26eae43be',N'{}')

    ti posto lo script credo che sto sbagliando qualcosa

    USE [website]
    GO
    /****** Object:  Trigger [dbo].[USERCREATION]    Script Date: 05/30/2012 18:31:56 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: sa
    -- Create date: 
    -- Description: GAMEACCOUNTCREATION
    -- =============================================
    ALTER TRIGGER [dbo].[USERCREATION] 
       ON  [dbo].[mws_users] 
       AFTER INSERT
    AS 
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

       INSERT INTO test.dbo.TBL_ACCOUNT (FLD_LOGINID, FLD_PASSWORD)
       Select username, password from inserted

       INSERT INTO test.dbo.TBL_ACCOUNT (FLD_PASSFAILCOUNT, FLD_PASSFAILTIME, FLD_MAKETIME, FLD_VER, FLD_VALIDFROM, FLD_FreeVALIDFROM, FLD_M2VALIDFROM, FLD_FreeM2VALIDFROM, FLD_M3VALIDFROM, FLD_FreeM3VALIDFROM, FLD_VALIDUNTIL, FLD_FreeVALIDUNTIL, FLD_M2VALIDUNTIL, FLD_FreeM2VALIDUNTIL, FLD_M3VALIDUNTIL, FLD_FreeM3VALIDUNTIL, FLD_SECONDS, FLD_FreeSECONDS, FLD_M2SECONDS, FLD_FreeM2SECONDS, FLD_M3SECONDS, FLD_FreeM3SECONDS, FLD_STOPCODE, FLD_STOPUNTIL, FLD_M2STOPCODE, FLD_M2STOPUNTIL, FLD_M3STOPCODE, FLD_M3STOPUNTIL, FLD_M2LASTLOGIN, FLD_M2LASTLOGOUNT, FLD_M3LASTLOGIN, FLD_M3LASTLOGOUNT, FLD_SSNO, FLD_PCHECK, FLD_SECEDE, FLD_MATRIX, FLD_CARDSTATUS, FLD_BINDDATE, FLD_CARDPASSFAILCOUNT, FLD_CARDPASSFAILTIME)
       VALUES ( 0, 0, 'NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL', 'NULL', 'NULL', 0, 0, 0, 0, 0, 0, 0, 'NULL', 0, 'NULL', 0, 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'N', 'NULL', 0, 'NULL', 0, 'NULL')

       INSERT INTO test.dbo.TBL_ACCOUNTADD (FLD_LOGINID,FLD_USERNAME)
       Select username,username from inserted

       INSERT INTO test.dbo.TBL_ACCOUNTADD (FLD_SSNO,FLD_BIRTHDAY,FLD_PHONE,FLD_MOBILEPHONE,FLD_ADDRESS1,FLD_ADDRESS2,FLD_EMAIL,FLD_QUIZ1,FLD_ANSWER1,FLD_QUIZ2,FLD_ANSWER2,FLD_ZIPCODE,FLD_ACCEPTNEWS,FLD_MON,FLD_PCHECK,FLD_PTEL,FLD_PSSNO,FLD_PNAME,FLD_PEMAIL)
       VALUES (0,0,0,0,0,0,0,'abc','abc','abc','abc',0,1,1,1,1,1,1,1)

       INSERT INTO test.dbo.TBL_USER (LOGID,PASSWORD)
       Select username,password from inserted

       INSERT INTO test.dbo.TBL_USER (FLD_PASSFAILCOUNT,FLD_PASSFAILTIME,FLD_VALIDFROM,FLD_ENDDATE,FLD_CURRENTPOINT,FLD_STOPUNTIL,REMAINED_DAYS,IS_OK,PAY_CODE,FLD_MAKETIME,FLD_VER)
       VALUES ('NULL','NULL','NULL','NULL','NULL','NULL','NULL',1,0,'NULL','NULL')

    END

    mercoledì 30 maggio 2012 16:39
  • Scusa ma perchè a seguito dell'istruzione 

    INSERT INTO test.dbo.TBL_ACCOUNT (FLD_LOGINID, FLD_PASSWORD)
    Select username, password from inserted

    esegui  

    INSERT INTO test.dbo.TBL_ACCOUNT (FLD_PASSFAILCOUNT, FLD_PASSFAILTIME, FLD_MAKETIME, FLD_VER, FLD_VALIDFROM, FLD_FreeVALIDFROM, FLD_M2VALIDFROM, FLD_FreeM2VALIDFROM, FLD_M3VALIDFROM, FLD_FreeM3VALIDFROM, FLD_VALIDUNTIL, FLD_FreeVALIDUNTIL, FLD_M2VALIDUNTIL, FLD_FreeM2VALIDUNTIL, FLD_M3VALIDUNTIL, FLD_FreeM3VALIDUNTIL, FLD_SECONDS, FLD_FreeSECONDS, FLD_M2SECONDS, FLD_FreeM2SECONDS, FLD_M3SECONDS, FLD_FreeM3SECONDS, FLD_STOPCODE, FLD_STOPUNTIL, FLD_M2STOPCODE, FLD_M2STOPUNTIL, FLD_M3STOPCODE, FLD_M3STOPUNTIL, FLD_M2LASTLOGIN, FLD_M2LASTLOGOUNT, FLD_M3LASTLOGIN, FLD_M3LASTLOGOUNT, FLD_SSNO, FLD_PCHECK, FLD_SECEDE, FLD_MATRIX, FLD_CARDSTATUS, FLD_BINDDATE, FLD_CARDPASSFAILCOUNT, FLD_CARDPASSFAILTIME)
       VALUES ( 0, 0, 'NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL', 'NULL', 'NULL', 0, 0, 0, 0, 0, 0, 0, 'NULL', 0, 'NULL', 0, 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'NULL', 'N', 'NULL', 0, 'NULL', 0, 'NULL')

    ?

    vai ad inserire una nuova riga praticamente vuota in TBL_ACCOUNT. Stesso discorso per la tabella TBL_USER e TBL_ACCOUNTADD.

    Non conosco la logica del tuo programma ma mi sembra errato che l'esecuzione del trigger effettui degli insert in altre tabelle specificando sempre gli stessi valori.

    L'errore che hai riportato poi, significa che stai tentando di inserire in una colonna datetime una stringa non convertibile sul tipo datetime. Infatti la seconda istruzione che ho riportato del tuo codice inserisce in molte colonne una stringa contenente il valore 'NULL'. Se intendevi inserire un NULL, cioè dato non valorizzato devi rimuovere gli apici che racchiudono la keyword NULL.

    Qui trovi una spiegazione sul funzionamento dei trigger e qui la spiegazione sulle tabelle inserted e deleted

    Ciao

    Luca


    Luca Ferrari http://tipsandtrickssqlserver.blogspot.com/

    mercoledì 30 maggio 2012 18:18
  • a seguito di questo 

    INSERT INTO test.dbo.TBL_ACCOUNT (FLD_LOGINID, FLD_PASSWORD)
    Select username, password from inserted

    devo riempire il resto delle tabelle e come credevo erroeneamente ho aggiunto un-altra funzione instert to nella stessa tabella.

    come faccio a prendere quei 2 campi da inserted mentre negli altri riempire dati con valori preimpostati? ho bisogno di aiuto con la sintassi credo..

    si per quanto riguarda la logica del programma non e' il massimo in seguito vedro' di modificarla e cene sono di cose da fare ma una cosa alla volta perche' devo imparare ancora molte cose e ci vuole molto tempo per ognuna xke sn poco sveglio.

    mercoledì 30 maggio 2012 19:02
  • nessuno è nato "imparato".. non preoccuparti !!! ;-)

    Se oltre ai dati prelevati da inserted devi inserire anche dei dati preimpostati sulla stessa riga ti basta fare :

    Insert into TBL_ACCOUNT (Fld_loginId,Fld_password, campo_1, campo_2..., campo_n) Select username,password, Valore_Campo_1, Valore_Campo_2...., valore_campo_n from inserted 

    dove valore_campo_1 etc sono i tuoi dati preimpostati. 

    In questo modo con una sola istruzione inserisci nella tabella i dati che stai inserendo prelevandoli dalla inserted ed integrandoli con i dati preimpostati.

    Lo stesso ragionamento lo puoi riprodurre sulle altre tabelle coinvolte nel trigger.

    Ciao

    Luca


    Luca Ferrari http://tipsandtrickssqlserver.blogspot.com/

    mercoledì 30 maggio 2012 19:17
  • ok perfetto funziona!!!!! grazie mille luca >D
    mercoledì 30 maggio 2012 19:33
  • de nada !! ;-)

    Ciao

    Luca


    Luca Ferrari http://tipsandtrickssqlserver.blogspot.com/

    mercoledì 30 maggio 2012 19:38