0

私の質問はLog、テーブルに保存されている参照を別のデータベースのデータにリンクするにはどうすればよいですか?

他のすべてのシステムに対して特定の重要なタスクを実行するシステム(Fusion と呼ばれる)を構築しています。これらの 1 つがログ記録です。

アイデアは、他のシステムが Fusion を使用して特定の操作をログに記録できるようにすることです。

CREATE TABLE [Log]
(
[LogID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[LoggedOn] [datetime] NOT NULL,
[ReferenceID] [int] NOT NULL,
[ReferenceLocation] [varchar](250) NOT NULL
)

したがって、上記の単純化されたテーブル設計では、ReferenceID列に別のデータベース列からの外部キーが格納されます。つまり、ニュース データベースの StoryID または人物データベースのPersonIDです

次に、列のdatabase.table.columnの場所をReferenceLocation格納します。ReferenceID

Logテーブルがクエリされたときに各行の参照データを返すことができるように、SQLクエリを(動的SQLまたは別の方法を使用して)作成できるという考えです。

これはそれを行う方法ですか?より良い方法はありますか?一般的に、この試みの背後にある理由を再考する必要がありますか?

4

3 に答える 3

0

schema.tablename と rowid だけを使用しないのはなぜですか?

于 2009-11-09T16:55:10.203 に答える
0

ここには「依存」がたくさんあります。いくつかのアイデア:

  • Database の列を追加します (「database」は予約語であるため、「DBName」)。同様の名前のオブジェクトが複数のデータベースにある場合 (顧客ごとに 1 つのインスタンスをサポートする必要がある場合など) に役立ちます。

  • スキーマ間で格納されている同様のオブジェクトがある場合は、オブジェクト スキーマの列を追加します。あなたが怠け者で (私はいつもそうです)、すべてが dbo にある場合は、気にしないでください。

  • 申請用の列を追加します。複数のものが同じオブジェクトを使用している場合、今回はどれがそれを行ったかを知ることが役立つ場合があります。

  • エラー、列の列を追加します。データを個別に追跡したい場合もあれば、集計して追跡したい場合もありますか?

  • これはすべて、「この」SQL インスタンスでのアクティビティのためのものだと思います。特に別のサーバーでホストされている場合は、ある SQL インスタンスのアクティビティを別の SQL インスタンスに記録することはお勧めしません。

  • 「UserID」で十分でしょうか? 関連するルックアップ (またはログイン) テーブルは常に利用可能ですか? ログイン名を追跡することで、より多くのマイレージを獲得できますか?

私のアイデアの共通点は正規化です。ログから何を取得したいかによっては、後続のクエリが非常に厄介になる可能性があるため、1 つの列に大量のデータ (DB、テーブル、列など) をまとめることはしません。

于 2009-11-09T17:57:14.617 に答える
0

に保存database.schema.tableReferenceLocation、主キー列名用に別のフィールドを用意するか、次のように標準の「ID」を使用します。

CREATE PROCEDURE p_GetFromLog(@LogId int)
AS
BEGIN
    DECLARE 
        @exe nvarchar(1000)
        ,@RefID int
        ,@RefTbl varchar(200)

    SET @RefTbl = SELECT [ReferenceLocation] FROM dbo.[Log] WHERE [LogID] = @LogId
    SET @RefID = SELECT [ReferenceID] FROM dbo.[Log] WHERE [LogID] = @LogId

    SET @exe= N'select * from database.schema.table_here WHERE [ID] = refrence_id_here'
    SET @exe = replace(@exe, 'database.schema.table_here', @RefTbl)
    SET @exe = replace(@exe, 'refrence_id_here', cast(@RefID AS varchar(12)))
    EXEC sp_executesql @exe
END
于 2009-11-09T17:42:17.293 に答える