0

我的问题是,如何将存储在Log表中的引用链接到另一个数据库中的一条数据?

我们正在构建一个系统(称为 Fusion),它将为我们所有其他系统执行某些关键任务,其中之一是日志记录。

这个想法是任何其他系统都将能够使用 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 。

然后ReferenceLocation将存储该列的database.table.column位置ReferenceID

想法是可以编写 SQL 查询(使用动态 SQL 或其他方法),以便在Log查询表时返回每一行的引用数据。

这是这样做的方法吗?有没有更好的办法?我们是否应该重新思考这一努力背后的原因?

4

3 回答 3

0

为什么不直接使用 schema.tablename 和 rowid?

于 2009-11-09T16:55:10.203 回答
0

我将存储database.schema.table在 中ReferenceLocation,并为主键列名称设置另一个字段,或者只使用标准的“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 回答
0

这里有很多“取决于”。一些想法:

  • 为数据库添加一列(“DBName”,因为“database”是保留字)。如果名称相似的对象位于多个数据库中(例如,如果您必须支持每个客户一个实例),则很有用。

  • 如果(再次)跨模式存储类似的对象,则为对象模式添加一列。如果你是一个懒惰的懒鬼(就像我通常一样)并且一切都在 dbo 中,请不要打扰。

  • 为应用程序添加一列。如果多个事物使用同一个对象,那么了解这次是哪一个对象可能会很有用。

  • 为 err 列添加一列。您可能有时想清楚地跟踪数据,有时是汇总数据吗?

  • 我猜这都是为了“这个”SQL 实例上的活动。我不建议在另一个 SQL 实例中记录一个 SQL 实例上的活动,尤其是当它托管在不同的服务器上时。

  • “UserID”是否足够?相关的查找(或登录)表是否始终可用?您可能会从跟踪登录名中获得更多里程吗?

我的想法的共同点是规范化。我不会将太多数据(例如数据库、表、列)放在一列中,因为——这取决于你想从日志中得到什么——这可能会使后续查询变得非常尴尬。

于 2009-11-09T17:57:14.617 回答