Frage

Auf unserer live / Produktionsdatenbank Ich versuche, einen Auslöser zu einer Tabelle hinzufügen, aber erfolglos geblieben war. Ich habe ein paar Mal versucht, aber es hat mehr als 30 Minuten gedauert für die Trigger-Anweisung erstellen zu vervollständigen und ich habe es abgebrochen.

Die Tabelle ist eine, die geschrieben wird lesen / zu oft von ein paar verschiedenen Prozessen. Ich habe die geplanten Aufträge deaktiviert, die die Tabelle und versucht manchmal aktualisieren, wenn es weniger Aktivität auf dem Tisch, aber ich bin nicht in der Lage, alles zu stoppen, die die Tabelle zugreift.

Ich glaube nicht, gibt es ein Problem mit der selbst Trigger-Anweisung erstellen. Die create trigger-Anweisung war erfolgreich und schnell in einer Testumgebung, und der Auslöser funktioniert richtig, wenn Zeilen eingefügt / in die Tabelle aktualisiert. Obwohl, wenn ich den Auslöser auf der Testdatenbank erstellt keine Last auf dem Tisch lag und hatte deutlich weniger Zeilen, die als auf der Live / Produktionsdatenbank unterscheiden (100 vs. 13 Mio. +).

Hier ist der Trigger-Anweisung erstellen, die ich laufen bin versucht,

CREATE TRIGGER [OnItem_Updated] 
    ON  [Item]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF update(State)
    BEGIN
        /* do some stuff including for each row updated call a stored 
          procedure that increments a value in table based on the 
          UserId of the updated row */
    END
END

Kann es Probleme mit einem Trigger für eine Tabelle erstellen, während Zeilen aktualisiert werden, oder wenn es viele Zeilen?

In SQLServer Trigger erstellt standardmäßig aktiviert. Ist es möglich, den Auslöser zu erstellen standardmäßig deaktiviert?

Jede andere Ideen?

War es hilfreich?

Lösung

Das Problem in der Tabelle selbst kann nicht sein, aber in den Systemtabellen, um aktualisiert werden müssen, um den Trigger zu erstellen. Wenn Sie eine andere Art von DDL als Teil Ihrer normalen Prozesse tun sie halten es werden könnte.

sp_who verwenden, um herauszufinden, wo der Block herkommt dann von dort zu untersuchen.

Andere Tipps

ich glaube, der CREATE-Trigger versuchen wird, eine Sperre für die gesamte Tabelle zu setzen.

Wenn Sie auf der Tabelle ein viel Aktivität haben, es könnte eine lange Zeit warten muß, und man kann einen Deadlock werden zu schaffen.

Für alle Schemaänderungen sollten Sie wirklich alle von der Datenbank erhalten.

Das heißt es ist verlockend zu setzen in „kleinen“ Änderungen mit aktiven Verbindungen. Sie sollten einen Blick auf die Schlösser / Anschlüsse nehmen, um zu sehen, wo die Sperr-Konflikt ist.

Das ist seltsam. Ein AFTER UPDATE Trigger sollte nicht brauchen vorhandene Zeilen in der Tabelle zu überprüfen. Ich nehme an, es ist möglich, dass Sie nicht in der Lage sind, eine Sperre auf der Tabelle zu erhalten, um den Trigger hinzuzufügen.

Sie könnten versuchen, einen Trigger erstellen, die im Grunde nichts tut. Wenn Sie das nicht schaffen können, dann ist es ein Sperr Problem. Wenn Sie können, dann könnten Sie diese Trigger deaktivieren, fügen Sie Ihren beabsichtigten Code auf den Körper, und es ihr ermöglichen. (Ich glaube nicht, dass Sie einen Trigger bei der Erstellung deaktivieren.)

Ein Teil des Problems sein kann auch der Auslöser selbst. Könnte Ihr Auslöser versehentlich alle Zeilen der Tabelle werden die Aktualisierung? Es gibt eine große differnce zwischen 100 Zeilen in einer Testdatenbank und 13.000.000. Es ist eine sehr schlechte Idee, Code gegen eine solche kleine Gruppe zu entwickeln, wenn man eine so große Datenmenge haben, wie Sie keine Möglichkeit, vorherzusagen Leistung haben kann. SQL, die für 100 Datensätze gut funktioniert vollständig sperren, ein System mit Millionen für Stunden. Sie wollen wirklich wissen, dass in dev, nicht, wenn Sie prod fördern.

eine gespeicherte Prozedur in einem Trigger Aufruf ist in der Regel eine sehr schlechte Wahl. Es bedeutet auch, dass Sie eine Schleife durch Aufzeichnungen haben, die eine noch schlechtere Wahl in einem Trigger ist. Trigger muss Konto für mehr Rekordeinsätze / Updates oder Löschungen alawys. Wenn jemand fügt 100.000 Zeilen (nicht unwahrscheinlich, wenn Sie 13 Millionen Datensätze), dann durch einen Datensatz basierend gespeicherte Prozedur Looping Stunden dauern könnte, sperren Sie die gesamte Tabelle und führen alle Benutzer wollen die Entwickler jagen und zu töten (oder zumindest verstümmeln) er, weil sie nicht ihre Arbeit erledigen kann.

würde ich nicht einmal diesen Trigger auf prod denken Sie daran setzen, bis Sie gegen einen Datensatz testen Größe simliar Set prod.

Mein Freund Dennis schrieb diesen Artikel, warum Testen eine kleine volumn von Informationen veranschaulicht, wenn Sie eine große volumn von Informationen haben Schwierigkeiten auf prd erstellen kann, die Sie nicht auf dev nicht bemerkt: http://blogs.lessthandot.com/index.php/DataMgmt/?blog=3&title=your-testbed-has-to-have-the-same-volume&disp=single&more= 1 & c = 1 & tb = 1 & pb = 1 # C1210

Ausführen DISABLE TRIGGER triggername ON tablename vor dem Trigger zu ändern, dann aktivieren Sie es mit ENABLE TRIGGER triggername ON tablename

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top