- 締切済み
SQLServerのトリガ機能について質問です
質問です! 困っているので早めの回答を望みます! <困っていること> SQLServer2005のシステムテーブル名「dba.sysprocesses」に データがInsertされた事をトリガとして起動し、Insertされた データを別テーブル(1テーブルで新規作成するテーブル) に反映したい。 システムテーブル内へのInsertをトリガとした処理は 可能なのでしょうか。 また、デメリット面などございましたら合わせて教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jamshid6
- ベストアンサー率88% (591/669)
#1です。 そもそも目的はセッション情報の収集だけですか? サンプルとしてログオントリガを使って「似たようなこと」をやる例をあげますが、もともとsys.sysprocesses(SQL Server 2005以降は動的管理ビューsys.dm_exec_sessionなどの利用が推奨されています)はリアルタイムの情報ですので、ログオンを検知してから動的管理ビューを参照するまでのコンマ秒以下のずれまでは保証の限りではありません。 CREATE TABLE [testdb].[dbo].[session_log]( [session_id] [smallint] NOT NULL, [login_time] [datetime] NOT NULL, [host_name] [nvarchar](128) NOT NULL, [program_name] [nvarchar](128) NOT NULL, [login_name] [nvarchar](128) NOT NULL ) GO CREATE TRIGGER [COLLECT_SESSION_INFO] ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON AS BEGIN INSERT INTO testdb.dbo.session_log SELECT session_id, login_time, host_name, program_name, EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(128)') FROM sys.dm_exec_sessions WHERE session_id=EVENTDATA().value('(/EVENT_INSTANCE/SPID)[1]','int') END GO ※EXECUTE ASのついた処理を実行する方法は一番簡単なのはTRUSTWORTHYをONにすることですが、その辺も含めて何をやっているか理解して試してください(トリガでセッション情報を収集しようと考えるくらいですから、素人ではないとお見受けしますが)
- jamshid6
- ベストアンサー率88% (591/669)
不可能でしょうね。 なぜなら、sysprocessesはシステムビューだからです。 システムビューにトリガは足せないですし、それ以前にこのビューに表示されるセッション情報が追加されるときに、INSERTイベントなど起こりません。 ビューの定義は以下の通りです。 CREATE VIEW sys.sysprocesses AS SELECT * FROM OpenRowSet(TABLE SYSPROCESSES) まあ、トリガで収集できるなら、SQL Server 2008のデータコレクタなど必要なかったでしょうしね。 ログオントリガなどを試すのがせいぜいかと思います。
補足
早速の返信ありがとうございます。 不可能との報告、残念ですが了解しました。 もしもご存知であればお聞きしたいのですが、 質問内容と同等の処理を別方法で実現することは 可能なのでしょうか。お教えくださいませ。
補足
引き続きの回答、誠にありがとうございます! こちらで試した上でまたご連絡いたします!