タグ付けされた質問 「trigger」

データベースイベントに応答して自動的に実行される手続き型コード。

1
トランザクションと組み合わせてトリガーする
次の状況があると仮定します。 Table_Aトリガーがオンになっているテーブル(たとえば)がありINSERTます。トリガージョブはtable_B、に挿入された値に基づいていくつかの行を更新しtable_Aます。 さて、テーブルに単純に行を挿入するだけで問題ありませんが、トランザクションを介してデータを挿入する状況についてはどうでしょうか?トリガーは、すべてのトランザクションステートメントが正常に実行されるまで待機しますか、それとも挿入を認識するとすぐに起動しますか?最初の挿入を認識するとすぐにトリガーが起動する場合、最後の行でトランザクションが失敗するとどうなりますか?その状況に何らかのメカニズムがありますか?

2
トリガーは毎回コンパイルされますか?
CPU使用率が高いサーバーのトラブルシューティングを行っています。クエリが実際に原因ではないことがわかった後、コンパイルを検討し始めました。 パフォーマンスモニターは、50コンパイル/秒未満および15再コンパイル/秒未満を示しています。 XEセッションを実行してコンパイルを探した後、毎秒数千のコンパイルが発生しています。 このシステムは、トリガーを使用して変更を監査しています。ほとんどのコンパイルはトリガーによるものです。トリガーはsys.dm_tran_active_transactionsを参照します。 最初に考えたのは、トリガーでDMVを参照すると毎回コンパイルされるか、この特定のDMVだけでトリガーされる可能性があるということでした。それで、私はその理論をテストし始めました。毎回コンパイルしますが、DMVを参照せず、代わりに値をハードコードするときにトリガーがトリガーされるたびにコンパイルされるかどうかはチェックしていませんでした。トリガーされるたびにコンパイルされていました。トリガーをドロップすると、コンパイルが停止します。 XEセッションでsqlserver.query_pre_execution_showplanを使用してコンパイルを追跡しています。なぜそれとPerfMonカウンターの間に矛盾があるのですか? トリガーが実行されるたびにコンパイルイベントを取得するのは正常ですか? 再現スクリプト: CREATE TABLE t1 (transaction_id int, Column2 varchar(100)); CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100)); GO CREATE TRIGGER t2_ins ON t2 AFTER INSERT AS INSERT INTO t1 SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2 FROM inserted; GO --Both of these show compilation …

1
postgresテーブルの各レコードに対してトリガーを実行する良い方法はありますか?
いくつかのテーブルのデザインを制御できないシステムがあり(Slony-Iを介して複製されます)、「シャドウテーブル」と呼ばれる一連のシステムがあり、複製されたテーブルから情報を抽出します。 、必要な処理済みフォームに保存し、無視したいレコードを削除します。 現在、新しいレプリカを設定した後、更新を実行し、値をそれ自体に設定して(たとえば、UPDATE tablename SET field=field)トリガーを強制的に実行しますが、一部のテーブルは数百万のレコードであり、成長し、30分かかることがあります。(そして、真空もあります)。 それをトリガーするより良い方法、または渡された入力またはNEW呼び出しコンテキストに依存する入力で機能するような関数を書く方法はありますか?1つが更新され、もう1つが更新されないことを何度も見てきたため、2つの異なる機能を保持することに消極的です。

4
テーブルの最大行数を1に制限する方法
SQL Serverデータベースに構成テーブルがあり、このテーブルには1行しかありません。将来の開発者がこれを理解できるように、複数行のデータが追加されないようにしたいと思います。以下のように、このためにトリガーを使用することを選択しました... ALTER TRIGGER OnlyOneConfigRow ON [dbo].[Configuration] INSTEAD OF INSERT AS BEGIN DECLARE @HasZeroRows BIT; SELECT @HasZeroRows = CASE WHEN COUNT (Id) = 0 THEN 1 ELSE 0 END FROM [dbo].[Configuration]; IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0 BEGIN RAISERROR ('You should not add more than one row …

1
すべてのトリガーにSET NOCOUNT ONを追加する必要がありますか?
あなたが持っているべきかなり一般的な知識です SET NOCOUNT ON デフォルトでは、新しいストアドプロシージャを作成します。 Microsoftはこれを2012年に含めるようにデフォルトのテンプレートを変更しました。これはトリガーでも同じであると考えましたが、テンプレートには含まれていません。 これは意図的ですか、それとも単なる見落としですか?

1
データをパージする最も簡単な方法は何ですか?
シナリオ: 我々は2つのテーブル持っているTbl1&Tbl2加入者サーバ上に。Tbl1出版社から複製されServer A、それは2つのトリガーがある-挿入および更新を。トリガーはにデータを挿入および更新していますTbl2。 今、私たちはパージしなければなりません(約9億件のレコード)からTbl2、合計で1億件以上のレコードがあります。以下は、1か月から1分間のデータ分布です。 1か月-14986826行 1日-483446行 1時間-20143行 1分-335行 私が探しているもの; 生産上の問題、データの一貫性、そしておそらくダウンタイムなしでそのデータを消去する最速の方法。だから、私は以下の手順に従うことを考えていますが、立ち往生しています:( 手順: BCP既存のテーブルTbl2から必要なデータを出力します(約1億レコード、約30分かかる場合があります)。 1Fab2018の午後10:00にアクティビティを開始し、1Fab2018の午後10:30に終了したとします。アクティビティが完了するまでに、テーブルTbl2はデルタになる新しいレコードを取得します Tbl3という名前でデータベースに新しいテーブルを作成します 新しく作成されたテーブルTbl3にエクスポートされたデータのBCP(約1億レコード、約30分かかる場合があります) 複製ジョブを停止します BCP-inが完了したら、tsqlスクリプトを使用して新しいデルタデータを挿入します。 課題は-デルタ「更新」ステートメントに対処する方法ですか? レプリケーションを開始する 追加の質問: シナリオに対処する最良の方法は何ですか?

2
トリガー:削除された行をアーカイブテーブルに移動する
restrictionsPostgreSQLデータベースで呼び出される小さな(〜10行)テーブルがあり、値が毎日削除および挿入されます。 restrictions_deletedから削除されるすべての行がrestrictions自動的に保存されるというテーブルが必要です。以来、restrictionsシリアルIDを有し、全く重複が存在しないであろう。 PostgreSQLでこのようなトリガーを作成するにはどうすればよいですか?


3
特定の列の更新を制限します。ストアドプロシージャによるこれらの列の更新のみを許可する
ストアドプロシージャを通じてのみ更新したい繊細な価格列があります。更新するように設計されたストアドプロシージャを使用していない場合、すべてのコードまたは手動でこれらの価格列の値を変更しようとすると失敗します。 トリガーとトークンテーブルを使用してこれを実装することを検討しています。私が考えているアイデアは、トークンテーブルを持つことです。ストアドプロシージャは、最初にトークンテーブルに値を挿入する必要があります。次に、価格列を更新します。更新トリガーは、更新された行のトークンテーブルにトークンが存在するかどうかを確認します。見つかった場合、続行します。トークンが見つからない場合、例外をスローし、更新トランザクションを失敗させます。 この制限を実装する良い/より良い方法はありますか?

4
トリガーからストアドプロシージャを呼び出す
次の構文を使用してmysqlにストアドプロシージャを作成しました。 DROP PROCEDURE IF EXISTS `sp-set_comment_count`; DELIMITER $$ CREATE PROCEDURE `sp_set-comment_count` (IN _id INT) BEGIN -- AC - AllCount DECLARE AC INT DEFAULT 0; SELECT COUNT(*) AS ac INTO AC FROM usergroups AS ug LEFT JOIN usergroup_comments AS ugm ON ugm.`gid` = ug.`id` LEFT JOIN mediagallery AS dm ON ugm.mid …

3
トリガーが有効な場合のレコードの削除が遅い
これは以下のリンクで解決されたと思います-回避策は動作します-しかし、パッチは動作しません。Microsoftサポートと協力して解決します。 http://support.microsoft.com/kb/2606883 わかりましたので、誰かがアイデアを持っているかどうかを確認するためにStackOverflowに捨てたい問題があります。 これはSQL Server 2008 R2でのことに注意してください 問題:15000レコードのテーブルから3000レコードを削除すると、トリガーが有効な場合は3〜4分かかり、トリガーが無効な場合は3〜5秒しかかかりません。 テーブルのセットアップ メインとセカンダリと呼ばれる2つのテーブル。セカンダリには削除するアイテムのレコードが含まれているため、削除を実行するとセカンダリテーブルに参加します。deleteステートメントの前にプロセスが実行され、削除するレコードがセカンダリテーブルに入力されます。 ステートメントを削除: DELETE FROM MAIN WHERE ID IN ( SELECT Secondary.ValueInt1 FROM Secondary WHERE SECONDARY.GUID = '9FFD2C8DD3864EA7B78DA22B2ED572D7' ); このテーブルには多くの列と約14の異なるNCインデックスがあります。トリガーが問題であると判断する前に、さまざまなことを試しました。 ページロックをオンにします(デフォルトではオフになっています) 手動で収集された統計 統計の自動収集を無効にしました 検証済みのインデックスの健全性と断片化 テーブルからクラスター化インデックスを削除しました 実行計画を調査しました(インデックスの欠落として表示されるものはなく、実際の削除にかかるコストは70%で、レコードの結合/マージには約28%でした) トリガー テーブルには3つのトリガーがあります(挿入、更新、削除の各操作に1つ)。削除トリガーのコードを変更して、単に戻るようにした後、1つを選択して、トリガーされる回数を確認しました。操作全体で1回だけ起動します(予想どおり)。 ALTER TRIGGER [dbo].[TR_MAIN_RD] ON [dbo].[MAIN] AFTER DELETE AS SELECT 1 RETURN 要点をまとめると トリガーがオンの場合-ステートメントの完了には3〜4分かかります トリガーがオフの場合-ステートメントの完了には3〜5秒かかります …


3
SQL Server:現在のセッションでのみ更新のトリガーを無効にする方法は?
SQL Server 2008 R2に取り組んでいます。 tiu_benefitという名前のAFTER INSERT、UPDATEトリガーを持つテーブルの利点があります。 このテーブルのUPDATEステートメントを記述して1行を更新したいのですが、トリガーを起動したくありません。UPDATEの前にトリガーを無効にしてから、UPDATEの後にトリガーを有効にできることを知っています。 DISABLE TRIGGER tiu_benefit ON benefit; GO UPDATE benefit SET editor = 'srh' where benefit_id = 9876 GO ENABLE TRIGGER tiu_benefit ON benefit; GO ただし、この無効化および有効化のトリガーは、現在ログインしているすべてのユーザーに影響します。そのため、トリガーによってスクリプトが無効になっている間に別のユーザーがUPDATE / INSERTを実行する可能性がありますが、これは適切ではありません。そのため、現在のセッションのトリガーのみを無効および有効にします。出来ますか?はいの場合、その方法を教えてください。 ありがとう

1
MySQLの既存のトリガー定義を変更することはできますか?
MySQLでトリガー定義を更新できるかどうか疑問に思っています。たとえば、トリガーTがあり、いくつかの新しい機能を追加したいです。 私の想定では、ドロップして再作成する必要があります。 このようなシナリオのデータベース管理のベストプラクティスは何ですか?
14 mysql  trigger  update 

2
UPDATE後にUPDATEをトリガーしますか?
更新の時間を次のように記録するトリガーを作成します。 CREATE TRIGGER col_update AFTER UPDATE ON col FOR EACH ROW BEGIN UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id END 問題は、このトリガーがupdated列を更新しようとすると、トリガーを実行する別の更新イベントでもあることです。これは無限ループを作成しますが、機能しません。 更新時間を対応する列に保存するにはどうすればよいですか? テーブルには多くの列があるため、トリガーを使用したいと思います。更新時間を手動で設定しようとすると、多くのクエリを変更する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.