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

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

5
データベース(DDLおよびDML)への変更を検出する方法
クライアントのSQLサーバーには多くのデータベースがあります。これらのデータベースは開発中であるため、開発者は設計、リファクタリング、データ変更などを行うことができます。ほとんど変更されないデータベースがいくつかあります。私のクライアントは、それらすべてを安全に(バックアップして)保持し、環境の管理に時間を費やさなければなりません。(会社にはDB管理者の立場はありません。)長い議論の末、クライアントは復元が容易なため、毎日の完全バックアップ戦略を使用することにしました。 状況の概要は次のとおりです。 データベースの数は毎日異なります。 変更されたデータベース(データや構造が変更されたことを意味します)はバックアップされます。 変更されていないデータベースはバックアップされません。 ソリューションはデータベース構造に影響を与えません(要件に制限はありません) この「バックアップエンジン」は自動的に機能します。 主な問題:データベースが変更されたことを検出する方法。問題の最初の部分(DDLの変更)は、DDLトリガーを使用して解決できます。ただし、データの変更(DMLの変更)は問題です。DMLトリガーをすべてのデータベースのすべてのテーブルに適用して、変更(パフォーマンス、拡張オブジェクトの管理など)を追跡することはできません。バックアップエンジンは、すべての変更を追跡して、各データベースをバックアップ準備完了としてマークする必要があります。 変更データキャプチャはソリューションですが、重すぎるようです(SQL Server Enterprise Editionも必要です)。 別の方法は、データベースファイルの変更(サイズまたは最終変更時刻)を追跡することですが、正しく機能しません。データベースは、予約されたすべての空き領域を超えたときにサイズを変更でき、sp_spaceusedは解決策ではありません。 トレースは解決策ですが、パフォーマンスの問題を引き起こし、追加の管理が必要です。 他のデータベース管理オブジェクト(統計など)に影響を与えずに、実際のデータベース使用量を計算するソリューションはありますか?テーブルのサイズを変更しないテーブルのデータへの変更はトリガーされないことを認めました(私は思う)が、それは何もないよりはましです。本当にSQL Server 2008の直接または間接的なソリューションを探しています。 コメント、解決策、考えをお寄せいただきありがとうございます。 追加: ソリューションは次のとおりです(Marianに感謝)。 Select NextLSN = MAX(fn.[Current LSN]) ,Databasename = DB_NAME() from fn_dblog(NULL, NULL) fn LEFT JOIN sys.allocation_units au ON fn.AllocUnitId = au.allocation_unit_id LEFT JOIN sys.partitions p ON p.partition_id = au.container_id LEFT JOIN …

3
MySQLストアドルーチンの動的SQL
ストアドルーチンとトリガーの制限に従って、動的SQLは使用できません(バージョン5.0.13以降のストアドプロシージャの制限は解除されました)。この制限が設定されているのはなぜですか?そして、なぜそれを手順のために持ち上げますが、機能やトリガーではありませんか?

2
Postgresの「遷移テーブル」とは何ですか?
Postgres 10の新機能を説明するページには、「トリガー用の移行テーブル」が記載されています。 トリガーの遷移表 この機能はAFTER STATEMENT、必要に応じて古い行と新しい行をクエリに公開することにより、トリガーを有用かつ高性能にします。この機能の前は、AFTER STATEMENTトリガーはこれらに直接アクセスできませんでした。回避策はビザンチンであり、パフォーマンスが低下していました。多くのトリガーロジックをとして記述できるようになりAFTER STATEMENT、FOR EACH ROWトリガーが必要とする各行で高価なコンテキストスイッチを行う必要がなくなりました。 遷移表とは何ですか?

1
COLUMNS_UPDATEDを使用して、特定の列のいずれかが更新されているかどうかを確認する方法
42列のテーブルと、これらの列のうち38列が更新されたときに何らかの処理を行うトリガーがあります。したがって、残りの4列が変更された場合、ロジックをスキップする必要があります。 私が使用することができUPDATE()関数と一つの大きな作成IF条件を、より短い何かをすることを好みます。COLUMNS_UPDATEDを使用すると、特定の列がすべて更新されているかどうかを確認できますか? たとえば、列3、5、および9が更新されているかどうかを確認します。 IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) PRINT 'Columns 3, 5 and 9 updated'; したがって、20列3との5値、および1列の値9は2番目のバイトの最初のビットに設定されているためです。ステートメントを変更するORと、列3および/ 5または列9が更新されているかどうかが確認されますか? OR1バイトのコンテキストでロジックを適用するにはどうすればよいですか?

4
異なるテーブルのデータを1つに集約するのは悪い習慣ですか?
バックグラウンド 私は、大規模なヘルスレコードDBについて多くの大きなレポートを作成し、一般的に管理しています(SP、機能、ジョブなどを作成します)。元のスキーマとそれを使用するソフトウェアは別のベンダーのものであるため、構造についてはあまり変更できません。ラボ、手順、ワクチンなど、追跡を必要とする多くのレコードがあり、それらは多数のテーブルに散らばっています。その多くは肥大化しており、インデックス付けが不十分です(これを多少修正できました)。 問題 問題は、DBをほとんど制御できないため、また特定の更新やパッチから変更される可能性があるため、これらのレポートの作成と保守が困難で面倒になることです(特に重複が多い場合)。必要なのは1つのパッチだけで、多数のレポートの大部分を書き直しています。さらに、結合、ネスト、選択、適用が積み重なると、クエリはすぐに難読化され、遅くなります。 私の「解決策」 私の計画は、これらすべてのレコードを1つの「キャッチオール」テーブルに書き込み、元のテーブルにトリガーを書き込んで、この集約テーブルのレコードを維持することでした。もちろん、更新後にトリガーが完全であることを確認する必要がありますが、保守性の観点から、データを参照するだけの方がはるかに簡単です。 テーブルは薄くて長く、必要なデータのみを保存します。次のようなものです。 CREATE TABLE dbo.HCM_Event_Log ( id INT IDENTITY, type_id INT NULL, orig_id VARCHAR(36) NULL, patient_id UNIQUEIDENTIFIER NOT NULL, visit_id UNIQUEIDENTIFIER NULL, lookup_id VARCHAR(50) NULL, status VARCHAR(15) NULL, ordered_datetime DATETIME NULL, completed_datetime DATETIME NULL, CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id) ) 次に、type_idやアイテムのグループ化などのさまざまなリレーショナルテーブルを作成します。 これらのテーブルのいくつかはかなり書き込まれているので、私はこの考えを二番目に推測し始めています。私が書いているSPとレポートはデータも多く参照します。したがって、このテーブルが大量のI / Oを伴うレコードのロックとパフォーマンスの悪夢になることを心配しています。 …

2
テーブルエラーを変更する原因と解決策は何ですか?
変換テーブルエラーは、設計上の欠陥または問題のあるクエリによって引き起こされることを理解しています。 最近、古いクエリが実稼働環境に導入され、変更テーブルエラーがスローされました。DBAが問題を解決しましたが、方法はわかりません。 変換テーブルエラーの正確な原因は何ですか?DBAはどのように問題を修正しましたか?
12 oracle  trigger  plsql 

3
トリガーの発火順序を変更するには?
本当にトリガーを使用することはめったにありません。だから私は初めて問題に遭遇した。トリガーを持つテーブルがたくさんあります(すべてのテーブルに2つ以上)。すべてのテーブルのトリガーを起動する順序を知り、変更したいと思います。この情報を取得することは可能ですか? 追加: ここに私が見つけたmssqltips に関する良い記事があります。

5
トリガーでINSERTEDテーブルとDELETEDテーブルを結合する恐ろしいパフォーマンス
特定の列が特定の値から他の値に変更されるのを監視するテーブルにUPDATEトリガーがあります。これが発生すると、単一のUPDATEステートメントを介して別のテーブル内の関連データを更新します。 トリガーが最初に行うことは、更新された行にこの列の値が問題の値から変更されているかどうかを確認することです。単にINSERTEDをDELETEDに結合し、その列の値を比較します。適格なものがなければ、早期にベイルアウトするため、UPDATEステートメントは実行されません。 IF NOT EXISTS ( SELECT TOP 1 i.CUSTNMBR FROM INSERTED i INNER JOIN DELETED d ON i.CUSTNMBR = d.CUSTNMBR WHERE d.CUSTCLAS = 'Misc' AND i.CUSTCLAS != 'Misc' ) RETURN この場合、CUSTNMBRは基礎となるテーブルの主キーです。このテーブルで大規模な更新(たとえば、5000行以上)を実行すると、CUSTCLAS列に触れていなくても、このステートメントでAGESがかかります。プロファイラーでこのステートメントが数分間停止するのを見ることができます。 実行計画は奇妙です。挿入されたスキャンが3,714回実行され、出力行が約1,850万行あります。CUSTCLAS列のフィルターを通過します。これは(ネストされたループを介して)削除されたスキャン(これもCUSTCLASでフィルタリングされます)に結合されます。これは1回だけ実行され、5000出力行を持ちます。 これを引き起こすために私はここでどんな馬鹿げたことをしていますか?トリガーは絶対に複数行の更新を適切に処理する必要があることに注意してください。 編集: 私はこれもこのように書いてみました(EXISTSが不愉快なことをしている場合に備えて)、それでも同じくらいひどいです。 DECLARE @CUSTNMBR varchar(31) SELECT TOP 1 @CUSTNMBR = i.CUSTNMBR FROM INSERTED i INNER JOIN …

2
UPDATE CASCADEを使用したFK制約によって操作が発生した場合、FOR EACH STATEMENTトリガーはどのくらいの頻度で実行されますか?
で定義されたテーブルtのトリガーは、FOR EACH STATEMENTを実行すると1回実行されることを理解していますUPDATE t ...。 では、をtで定義しFOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE、でN行を更新aすると、トリガーが1回呼び出されるのですか、それともN回呼び出されるのですか? 別の言い方をすると、FK制約によってカスケードされたテーブルへの変更は、単一のUPDATE、または一連のUPDATEのようなものですか?

3
誰がレコードを削除したかに関する情報を削除トリガーに渡す
監査証跡を設定する際に、テーブルのレコードを更新または挿入している人を追跡することには問題はありませんが、レコードを削除した人を追跡することはより問題が多いようです。 挿入/更新フィールドに「UpdatedBy」を含めることで、挿入/更新を追跡できます。これにより、INSERT / UPDATEトリガーはを介して "UpdatedBy"フィールドにアクセスできますinserted.UpdatedBy。ただし、削除トリガーを使用すると、データは挿入/更新されません。誰がレコードを削除したかを知ることができるように、情報を削除トリガーに渡す方法はありますか? これは挿入/更新トリガーです ALTER TRIGGER [dbo].[trg_MyTable_InsertUpdate] ON [dbo].[MyTable] FOR INSERT, UPDATE AS INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges) VALUES (inserted.ID, inserted.LastUpdatedBy) FROM inserted SQL Server 2012の使用

1
PostgreSQL 8.4でトリガー関数を実行するために必要な権限は何ですか?
PostgreSQL 8.4でトリガー関数を実行するために必要な権限は何ですか? ロールに設定された権限は、トリガー機能を実行する上で重要ではないようです。トリガー関数を実行するために必要な特権はEXECUTE特権であるが、トリガー関数を呼び出すトリガーを起動するアクションを実行する実際のロールではなく、テーブルの所有者にとってある日を見たことがあります。 その点を説明するドキュメント部分が見つかりません、何か助けはありますか?

1
トリガーで変更テーブルエラーが発生しないのはなぜですか?
トリガー内の変更テーブルでDMLステートメントを使用できないことはわかっています(または少なくとも知っていました)。Oracleのドキュメントからの抜粋: 変更テーブルは、UPDATE、DELETE、またはINSERTステートメントによって変更されるテーブル、またはDELETE CASCADE制約の影響によって更新される可能性があるテーブルです。 トリガーステートメントを発行したセッションは、変更テーブルをクエリまたは変更できません。この制限により、トリガーが一貫性のないデータセットを参照するのを防ぎます。 ただし、insert into empSQL DeveloperまたはSQL * Plusを使用してこのデモトリガーが「変更テーブル」エラーで失敗しない理由を理解できません。 CREATE OR REPLACE TRIGGER emp_bri BEFORE INSERT ON emp FOR EACH ROW BEGIN SELECT max(id) + 1 INTO :NEW.id FROM emp; UPDATE emp SET salary = 5000; END emp_bri; 挿入は次のid値で正常に完了し、すべてのempレコードを更新します。Oracle Database 11g Enterprise Editionリリース11.2.0.1.0を使用しています。複合トリガーについて読みましたが、サンプルでは使用していません。

1
更新後に行全体が同じままである場合にトリガーをチェックインする方法は?
もちろん、次のように比較するすべての列でそれを行うことができます: if (old.column1 = new.column1 and old.column2 = new.column2...) しかし、たとえば将来的に別の列を追加する場合は、ハードコーディングし、維持するのが困難になります。 個々の列をすべて手動で確認せずに、すべての列が同じかどうかを確認する方法はありますか?

2
PostgreSQLのビューとトリガーを通じて現在のユーザーを追跡する
現在のユーザーに応じてレコードへのアクセスを制限し、ユーザーが行った変更を追跡するPostgreSQL(9.4)データベースがあります。これはビューとトリガーによって達成され、ほとんどの場合これはうまく機能しますが、INSTEAD OFトリガーを必要とするビューに問題があります。私は問題を減らすように努めましたが、これがまだかなり長いことを前もってお詫びします。 状況 データベースへのすべての接続は、単一のアカウントを介してWebフロントエンドから行われますdbweb。接続されると、SET ROLEWebインターフェースを使用するユーザーに対応するように役割が変更され、そのような役割はすべてグループ役割に属しdbuserます。(詳細については、この回答を参照してください)。ユーザーがであるとしますalice。 テーブルのほとんどは、ここで呼び出しprivateて所属するスキーマに配置されていますdbowner。これらのテーブルには直接アクセスできませんdbuserが、別のロールにはアクセスできますdbview。例えば: SET SESSION AUTHORIZATION dbowner; CREATE TABLE private.incident ( incident_id serial PRIMARY KEY, incident_name character varying NOT NULL, incident_owner character varying NOT NULL ); GRANT ALL ON TABLE private.incident TO dbview; 現在のユーザーaliceが特定の行を使用できるかどうかは、他のビューによって決定されます。簡略化された例(減らすことができますが、より一般的なケースをサポートするには、この方法で行う必要があります)は次のようになります。 -- Simplified case, but in principle could join multiple tables to determine allowed …

1
トリガーを使用した同期
私は以前の議論と同様の要件を持っています: 単純な銀行スキーマの作成:残高を取引履歴と同期させるにはどうすればよいですか? トランザクションと組み合わせたトリガー 私は2つのテーブルを持っています、[Account].[Balance]そして[Transaction].[Amount]: CREATE TABLE Account ( AccountID INT , Balance MONEY ); CREATE TABLE Transaction ( TransactionID INT , AccountID INT , Amount MONEY ); [Transaction]テーブルに対して挿入、更新、または削除がある場合、に[Account].[Balance]基づいてを更新する必要があり[Amount]ます。 現在、私はこの仕事をするきっかけを持っています: ALTER TRIGGER [dbo].[TransactionChanged] ON [dbo].[Transaction] AFTER INSERT, UPDATE, DELETE AS BEGIN IF EXISTS (select 1 from [Deleted]) OR EXISTS (select 1 …

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