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

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

2
MySQLでのトリガーvsストアドプロシージャのパフォーマンス
ここのDBA.StackExchangeの投稿(レコードのリビジョン番号を維持するためのトリガーのベストプラクティスは何ですか?)は、MySQLのパフォーマンスに関する興味深い質問(少なくとも、私にとって興味深い)を生み出しました。 コンテキストは、更新される行ごとにテーブルにレコードを挿入することです。行が更新される前に、以前の値を保存してから、列の1つ(「バージョン」列)を増分します。 これをトリガー内で実行すると、うまく機能します。MySQLの場合、トリガーは行ごとに行われるため、簡単に解決できます。現在テーブルにあるデータを選択し、それをロギングテーブルに挿入して、新しいデータの「バージョン」列を更新します。 ただし、このロジックをストアドプロシージャに移動することは可能です。その場合、挿入を実行してから、テーブルの「バージョン」列をインクリメントします。全体がベースに設定されます。 それで、この挿入を実行することになると、セットベースのストアドプロシージャアプローチまたはトリガーベースのアプローチを使用する方がパフォーマンスが良くなりますか? この質問はMySQLに関するものです(行ごとのトリガーがあるため)。ただし、他の行ごとのトリガーDBMSにも当てはまります。

1
影響を受ける行がないにもかかわらずトリガーをトリガー
これはより一般的な質問ですが、この質問の動機は、SQL Serverの使用中に直面した問題でした。 このトリガーは、副作用として、行が挿入されなかった場合にエラーが発生するロジックを含むテーブルのInsertイベントにアタッチされています。さらに調査したところ、行が挿入されていないにもかかわらず、トリガーが発動していることがわかりました。 MicrosoftドキュメントのDMLトリガーで使用されている言語は、この動作と矛盾しているようです。 DMLトリガーは、トリガーで定義されたテーブルまたはビューに影響するDMLイベントが発生すると自動的に有効になる特殊なタイプのストアドプロシージャです。 これは、DBMS全体のデフォルトの動作ですか?影響を受ける行がないときにトリガーを起動する特別な理由はありますか?

1
クロスデータベース証明書を使用する場合のトリガーの権限
私のデータベース(SQL Server 2008 R2)の特定のデータベースへのアクセスを制御するために、クロスデータベース証明書(Erland Sommarskogが説明)を使用しています。 私はデータベースBのテーブルを更新するデータベースAのストアドプロシージャを持っています。これは、これまで、db Aのさまざまなストアドプロシージャとdb Bのテーブルで常に機能していました。db Bのテーブルを更新しようとしていますが、テーブルにトリガーがあります。このトリガーは、db Bの別のテーブルに追加のデータを挿入しています。次のエラーが発生します。 メッセージ916、レベル14、状態1、プロシージャtable_trigger、行11サーバープリンシパル "sql \ login"は、現在のセキュリティコンテキストではデータベース "B"にアクセスできません。 証明書に関連付けられているデータベースBユーザーに、他のテーブルに挿入する挿入アクセス許可を付与しようとしましたが、エラーは解決しませんでした。トリガーを変更する以外にオプションはありWITH EXECUTE AS OWNERますか? 問題を再現するDDLは次のとおりです。 CREATE LOGIN [GuggTest] WITH PASSWORD=N'abcd', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF CREATE DATABASE A; CREATE DATABASE B; USE A; CREATE TABLE dbo.SPtoUpdate ( ID INT , ILoveFishing VARCHAR(255) ); INSERT INTO dbo.SPtoUpdate ( …

1
テンポラルデータベース設計で一意のエントリを確保する正しい方法は何ですか?
テンポラルデータベースの設計に問題があります。店舗の任意の時間枠でアクティブレコードが1つだけであることを確認する方法を知る必要があります。私はこの答えを読みましたが、トリガーがどのように機能するかについて頭を抱えることはできません。特に、レコードの更新を防ぎ、代わりに新しいレコードを挿入する既存のトリガーをトリガーする方法。私の本当の問題は、終了日がnullの場合にストアが複数の有効日を持つことを防ぐ方法がわからないことです。(つまり、ストアの2つのアクティブなレコードを防止します) これは私が持っているものですが、有効日が異なる店舗の新しいレコードを挿入できます。 テーブル定義: /****** Object: Table [PCR].[Z_STORE_TEAM] Script Date: 05/09/2014 13:05:57 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) DROP TABLE [Z_STORE_TEAM] GO IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Z_STORE_TEAM]') AND type in (N'U')) BEGIN CREATE TABLE [Z_STORE_TEAM]( [STORENUM] …

1
行の変更時に日付フィールドと時間フィールドを更新するトリガーを作成するにはどうすればよいですか?
次の構造を持つtesttableデータベース内にテーブルを作成しましたtestbase。 product_no (int, not null) product_name (varchar(30), not null) price (money, null) expire_date (date, null) expire_time (time(7), null) ただし、変更された(または新しい情報で更新された)特定の行を更新し、変更日をexpire_dateフィールドに、変更時間をフィールドに記録するようにトリガーを作成するにはどうすればよいexpire_timeですか?(またはこれが可能かどうか)

1
mysqldumpはトリガーとプロシージャをダンプできますか?
指定されたデータベースからすべてのトリガーとプロシージャを保存するmysqldumpを作成する方法はありますか? 少し前に私はそれを読んでmysqldumpトリガーも保存されますが、そのようには見えません。2つ目の関連する質問は、トリガーが存在する場合にSQLファイルをチェックインするにはどうすればよいですか?

3
挿入トリガーからPythonスクリプトを起動する
いくつかの電子メールを送信し、クラウドシステムとやり取りするPythonの素晴らしい部分があります。正常に動作します。しかし、dbをポーリングするには、数分ごとに実行する必要があります。ビジネス目的では、Pythonスクリプトをリアルタイムで実行する必要があるため、ポーリングの遅延はありません。(これは、顧客と電話で連絡している営業担当者に提供されます。) 実際には1分のポーリングループは必要ありません。または30秒。レコードをdbに表示して、すぐに何かが起こるようにしたいと思っています。 このフライをすばやく作成するには、特定のレコードタイプがテーブルに挿入されたときにこれを起動します。 トリガーからPythonスクリプトを起動できますか? 以下のAaronのメモによれば、これはVery Bad Thing™であることがわかりますが、このテーブルはほとんど使用されません(1日に0〜12挿入)。テーブルをポーリングしても、ビジネスニーズを満たすことができません(.pyをすぐに実行する必要があります-電子メールを送信するだけではありません)。 私たちのビジネスニーズを満たす方法は、SQL Serverに.netバージョンのpythonをセットアップし、T-SQLがC#のものを呼び出す方法でpythonスクリプトを呼び出すようにすることです... しかし、私たちは方法がわかりません実際にこれを行う!(この質問に答えてください)。 ドキュメント/詳細? Stack Overflowでフォローアップの質問をしました:SQL ServerでPython CLRプロシージャを作成するにはどうすればよいですか? 質問の下の質問:あなたはPythonの断片を持っています。SQLトリガーから起動したいのですが、それは非常に悪いことです。では、SQL操作の途中でPythonコードを使用せずに同じ効果を実際に達成するにはどうすればよいでしょうか。 このニーズを解決するための非トリガー、非ポーリングのアプローチは何ですか? (同じ効果=「テーブルで挿入/更新/削除が行われ、テーブルをポーリングせずに、dbイベントの2秒以内にPythonスクリプトがトリガーされます」)

3
実際の変更でのみ発生するT-SQLトリガーはどのように作成されますか?
別のテーブルに行を追加するUPDATEおよびINSERTのテーブルトリガーがあります。4つの列のいずれかが変更された場合にのみ行を追加する必要があります。IF UPDATE(col)を使用して変更をテストしようとしましたが、盲点がありました。これは、いくつかの値が入ったことをテストするだけです。深く掘り下げる必要があります。新旧の値を比較して、真の変化が発生したことを確認する必要があります。INSERTとUPDATEの両方で機能する必要があります。 挿入されたテーブルと削除されたテーブルの両方にトリガー内で比較できる値があるため、簡単なUPDATEの場合。ただし、INSERTの場合、値を持つのは挿入テーブルだけです。これはすべて同じトリガーで必要なので、そのINSERTケースをどのように処理しますか? これが、変更するトリガーのスクリプトです。 ALTER TRIGGER [dbo].[trATPerson_alter] ON [mydb].[dbo].[AT_Person] AFTER INSERT,UPDATE AS BEGIN SET NOCOUNT ON; -- Not all updates require a push IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR UPDATE([JobCode]) OR UPDATE([Inactive])) BEGIN INSERT INTO [mydb].[dbo].[AT_Person_To_Push] ( [Facility], [VendorID], [Person_code], [First_Name], [Last_Name], [JobCode], [Alink], [Inactive] ) SELECT [Facility], [VendorID], [Person_code], [First_Name], …
9 t-sql  trigger 

1
パーティションビューで削除を実行すると、クラスター化インデックスが挿入されるのはなぜですか?
以下の挿入トリガーがあるパーティションビューがあります(貧弱なパーティション)。DELETEを実行すると、以下のクエリプランが表示されます。 delete from factproductprice where pricedate = '20170725' ビューのトリガー: ALTER TRIGGER [dbo].[factProductPriceDelete] ON [dbo].[FactProductPrice] INSTEAD OF DELETE AS BEGIN IF @@ROWCOUNT = 0 RETURN; DECLARE @PriceDate DATE SELECT @PriceDate = CAST(PriceDate AS DATE) FROM DELETED IF @PriceDate BETWEEN '20140101' AND '20141231' BEGIN DELETE FROM dbo.FactProductPrice2014 WHERE ProductId IN (SELECT ProductId …

4
SQL Server 2008 R2でテーブルを使用しているストアドプロシージャまたはトリガーを知るにはどうすればよいですか?
これは、私がチェックしているDBに、ユーザー履歴を保持するアーカイブテーブルがあり、しばらくするとこのテーブルから行を削除するトリガーまたはストアプロシージャがあり、同じように、私はDBを設計しませんでした。このDBを使用するアプリケーションのメンテナンスを行っているだけなので、これらのストアドプロシージャまたはトリガーの名前がわかりません。このストアドプロシージャを探します。またはトリガーして、コードを確認し、この「ユーザー履歴」をテーブルに長く残すようにコードを変更します。 誰かが「sysobjects」テーブルをチェックするように言われました。そこでは、テーブルの同じ名前の何かが実際に表示されますが、これは私が取得できた唯一の情報です。アドバイスはありますか? ありがとうございました。

1
SQL ServerのトリガーをOracleの書き込みトリガーに書き換えるにはどうすればよいですか?
元々Oracle用に作成されたトリガーをSQL Server用に書き換える方法を教えてください。 これが私のOracleトリガーコードです: CREATE OR REPLACE TRIGGER P000KUL_TEST BEFORE INSERT ON P000KUL REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN SELECT TO_CHAR(SYSDATE, 'dd/mm/RRRR') INTO :NEW.SYSTEM_DATE FROM DUAL; SELECT TO_CHAR(SYSDATE, 'hh:mi') INTO :NEW.SYSTEM_TIME FROM DUAL; END;

3
作成時にデータベース照合を変更するトリガー
トリガーを作成して、作成時にデータベースの照合を変更しようとしていますが、トリガー内で使用するデータベース名をキャッチするにはどうすればよいですか? USE master GO CREATE TRIGGER trg_DDL_ChangeCOllationDatabase ON ALL SERVER FOR CREATE_DATABASE AS declare @databasename varchar(200) set @databasename =db_name() ALTER DATABASE @databasename COLLATE xxxxxxxxxxxxxxxxxxx GO 明らかに、これは機能していません。


1
組み込み関数を使用してデータベーストリガーの名前を解決するにはどうすればよいですか?
ユーザーデータベースに特定のプロシージャを作成できないようにするために使用するデータベーストリガーがあります。 それはで表示されsys.triggersて、object_idが、私は使用することはできませんobject_idそれを見つけるために関数を。 SELECT OBJECT_ID(t.name, t.type) AS object_id, * FROM sys.triggers AS t; 同様に、私はそれをで見つけることができますsys.dm_exec_trigger_stats。object_name解決することはできませんが、解決object_definitionします。 SELECT OBJECT_NAME(dets.object_id, dets.database_id) AS object_name, OBJECT_DEFINITION(dets.object_id) AS object_definition, * FROM sys.dm_exec_trigger_stats AS dets; データベースレベルのトリガーのオブジェクトIDを受け入れ、その名前を返す関数はありますか?

2
pg_trigger_depth()は、トリガーのカスケード(再帰)を防止するために使用するのは悪いですか?
pg_trigger_depth() = 0トリガーのカスケード(再帰)を防止するときに(デバッグ以外の目的で)使用するのが悪いのはなぜですか? 誰かがなぜそれが悪いのかを示すコードを提供できますか? 複数のトリガーが同じデータで同時に機能している場合、トリガーを使用して停止する条件pg_trigger_depth() = 0は、2番目に機能するトリガーを停止するためだと思います。 私はそれがこの(私の)質問に対する良い解決策になると思いましたが、そうでないと言われました: トリガー内に、更新または挿入がトリガーから来たかどうかを確認する方法はありますか? それは良い質問をするだろうと思った。 これはソリューションとしてここに提供されています: PostgreSQLの再帰トリガーを防止する Postgres 9.3ドキュメント: https://www.postgresql.org/docs/9.3/static/functions-info.html

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