Welcome to Sign in | Help
in Search

dm triggers fire

Last post 05-01-2012, 11:54 AM by B_gd_n[ ]Sahlean. 3 replies.
Sort Posts: Previous Next
  •  04-24-2012, 3:41 PM 9220

    dm triggers fire

    Exista in sql vreo posibilitate ca sa pot seta ca un trigger dml sa se declanseze pentru fiecare rand ,sau la nivel de dm statement?
    Ex: update employees set name="giglel" where
    address like "a%".
    Trigggerul dml de update sa se declanseze pentru fiecare rand sau o singura data la nivel de statmenent se poate configura asta?
    Multumesc
    Secolul XXI ori va fi religios ori nu va fi deloc
  •  04-25-2012, 11:35 AM 9223 in reply to 9220

    Re: dm triggers fire

    crestinul:
    Trigggerul dml de update sa se declanseze pentru fiecare rand sau o singura data la nivel de statmenent se poate configura asta? Multumesc


    Triggeri DML sunt la nivel de statement. În sintaxa comenzii CREATE TRIGGER din T-SQL (SQL Server) nu există nici un element care să permită configurarea modului de activare a triggerilor așa cum există FOR EACH ROW în MySQL (doar la nivel de row - conform documentației) sau ORACLE (la nivel de statement sau row - conform documentației). În plus, syntaxa T-SQL folosită de către Sybase Anywhere/ASE include sintaxa [ FOR  EACH  { ROW  | STATEMENT  } ].

    Un test demonstrează comportamentul serverului în acest caz:
    CREATE TABLE TestTrigger
    (
        Id INT IDENTITY PRIMARY KEY,
        Col1 INT NOT NULL,
        Col2 VARCHAR(20) NULL
    );
    GO

    CREATE TRIGGER trg_IUD_TestTrigger
    ON TestTrigger
    AFTER INSERT, UPDATE, DELETE
    AS
    BEGIN
        SELECT    i.Id AS inserted_id, i.Col1 AS inserted_Col1, i.Col2 AS inserted_Col2
        FROM    inserted i;

        SELECT    i.Id AS deleted_id, i.Col1 AS deleted_Col1, i.Col2 AS deleted_Col2
        FROM    deleted i;
    END;
    GO
    --TRUNCATE TABLE TestTrigger
    PRINT '--Test 1--';
    INSERT    TestTrigger(Col1, Col2)
    VALUES    (11, 'A');

    PRINT '--Test 2--';
    INSERT    TestTrigger(Col1, Col2)
    SELECT    22, 'B'
    UNION ALL
    SELECT    33, 'C';

    PRINT '--Test 3--';
    UPDATE    TestTrigger
    SET        Col2 = NULL;

    --Rezultate
    --Test 1--
    inserted_id inserted_Col1 inserted_Col2
    ----------- ------------- --------------------
    1           11            A
    deleted_id  deleted_Col1 deleted_Col2
    ----------- ------------ --------------------

    --Test 2--
    inserted_id inserted_Col1 inserted_Col2
    ----------- ------------- --------------------
    3           33            C
    2           22            B
    deleted_id  deleted_Col1 deleted_Col2
    ----------- ------------ --------------------

    --Test 3--
    inserted_id inserted_Col1 inserted_Col2
    ----------- ------------- --------------------
    3           33            NULL
    2           22            NULL
    1           11            NULL
    deleted_id  deleted_Col1 deleted_Col2
    ----------- ------------ --------------------
    3           33           C
    2           22           B
    1           11           A



  •  04-26-2012, 2:46 PM 9227 in reply to 9223

    Re: dm triggers fire

    B_gd_n[ ]Sahlean:
    crestinul:
    Trigggerul dml de update sa se declanseze pentru fiecare rand sau o singura data la nivel de statmenent se poate configura asta?
    Multumesc


    Triggeri DML sunt la nivel de statement. În sintaxa comenzii CREATE TRIGGER din T-SQL (SQL Server) nu există nici un element care să permită configurarea modului de activare a triggerilor așa cum există FOR EACH ROW în MySQL (doar la nivel de row - conform documentației) sau ORACLE (la nivel de statement sau row - conform documentației). În plus, syntaxa T-SQL folosită de către Sybase Anywhere/ASE include sintaxa [ FOR  EACH  { ROW  | STATEMENT  } ].

    Un test demonstrează comportamentul serverului în acest caz:
    CREATE TABLE TestTrigger
    (
        Id INT IDENTITY PRIMARY KEY,
        Col1 INT NOT NULL,
        Col2 VARCHAR(20) NULL
    );
    GO

    CREATE TRIGGER trg_IUD_TestTrigger
    ON TestTrigger
    AFTER INSERT, UPDATE, DELETE
    AS
    BEGIN
        SELECT    i.Id AS inserted_id, i.Col1 AS inserted_Col1, i.Col2 AS inserted_Col2
        FROM    inserted i;

        SELECT    i.Id AS deleted_id, i.Col1 AS deleted_Col1, i.Col2 AS deleted_Col2
        FROM    deleted i;
    END;
    GO
    --TRUNCATE TABLE TestTrigger
    PRINT '--Test 1--';
    INSERT    TestTrigger(Col1, Col2)
    VALUES    (11, 'A');

    PRINT '--Test 2--';
    INSERT    TestTrigger(Col1, Col2)
    SELECT    22, 'B'
    UNION ALL
    SELECT    33, 'C';

    PRINT '--Test 3--';
    UPDATE    TestTrigger
    SET        Col2 = NULL;

    --Rezultate
    --Test 1--
    inserted_id inserted_Col1 inserted_Col2
    ----------- ------------- --------------------
    1           11            A
    deleted_id  deleted_Col1 deleted_Col2
    ----------- ------------ --------------------

    --Test 2--
    inserted_id inserted_Col1 inserted_Col2
    ----------- ------------- --------------------
    3           33            C
    2           22            B
    deleted_id  deleted_Col1 deleted_Col2
    ----------- ------------ --------------------

    --Test 3--
    inserted_id inserted_Col1 inserted_Col2
    ----------- ------------- --------------------
    3           33            NULL
    2           22            NULL
    1           11            NULL
    deleted_id  deleted_Col1 deleted_Col2
    ----------- ------------ --------------------
    3           33           C
    2           22           B
    1           11           A





    Multumesc.Eu cred ca e o limitare asta cel putin fata de pl sql unde iti poti defini triggeri la nivel de rand,dupa cum ziceai si tu...
    Secolul XXI ori va fi religios ori nu va fi deloc
  •  05-01-2012, 11:54 AM 9231 in reply to 9227

    Re: dm triggers fire

    Dpmdv, caracteristica definitorie a limbajului SQL/T-SQL este procesarea seturilor de înregistrări. Din acest punct de vedere, triggerii activaţi la nivel de statement (si nu la nivel de înregistrare/FOR EACH ROW) plus tabelele inserted & deleted se încadrează cel mai bine în aceasta abordare.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems