1

これは架空の質問です。以下にリストされている問題は完全に架空のものですが、誰かが答えを持っていれば、将来の参考に役立つと思います.

複数のシステムがすべて SQL Server 上の同じデータ テーブルにデータを入力する状況があります。これらのシステムの 1 つは、一貫したパターンではありますが、テーブルに誤ってデータを入力しているようです (複数のシステムではなく、単一のシステムのバグであると私は信じています) 。ソース コードを表示したり、機能を変更したりすることはできません。原因となったシステムの開発者にバグ レポートを提出したいのですが、システムがテーブルに識別可能な痕跡を残さないため、それがどれであるかはわかりません。単一のシステムは、単一のタイムスタンプ フィールドが適切な監査であると信じており、これが再検討されたことはありません。

私たちのソリューションは、完全に SQL ベースでなければなりません。私たちの考えでは、テーブルにトリガーを書き込んで、何らかの方法でクエリのソース (つまり、それがどこから来たのか) を取得することでしたが、それが可能かどうか、または方法がわからない.

これにはいくつかの明確な解決策があります。たとえば、すべての開発者に連絡してソフトウェアを更新して新しいsoftware_IDフィールドにデータを入力し、新しい情報を使用して後で障害のあるシステムを特定します (そして、架空の自己と同様の頭痛の種を後で保存します)。 SQL Server (または別の巧妙なソリューション) で純粋に社内で行うことができるものがあるかどうかを知ることに特に興味があります。

4

3 に答える 3

1

問題のテーブルのコピーを作成し、識別子nvarcharを保持するフィールドを1 つ追加できます。

次に、テーブルに挿入 (および場合によっては更新) のトリガーを作成し、トリガーで同じ行をコピーに挿入し、識別子を追加します。識別子は、たとえば、接続のログイン名である可能性があります。

insert into tableCopy select SUSER_SNAME(), inserted.* from inserted

またはおそらくクライアントIP:

declare @clientIp varchar(255);

SELECT clientIp = client_net_address
FROM sys.dm_exec_connections
WHERE Session_id = @@SPID

insert into tableCopy select @clientIp, inserted.* from inserted

または、クライアント アプリケーションを識別することができる接続コンテキスト(より正確な用語がないため)から取得できるその他の何か。

ただし、テーブルのコピーに挿入してもエラーが発生しないことを確認してください。主キーとインデックスは、おそらくコピーから削除する必要があります。

于 2013-06-27T10:23:28.087 に答える
1

ちょっとしたアイデア:EXEC sp_who2疑わしい値がテーブルに格納されたときに取得した情報を専用のテーブルに保存するトリガーを作成します。

おそらく、ステータス RUNNABLE で sp_who2 値をフィルタリングできます。

したがって、複数のユーザーが同じログインを共有している場合、コマンドが実行された正確な瞬間を特定し、そこから調査を開始できます...

于 2013-06-27T10:23:55.837 に答える