2009-11-09 59 views
0

我的问题是,我如何将存储在Log表中的引用链接到另一个数据库中的一段数据?通用数据库日志系统:存储对另一个database.table.column的引用

我们正在构建一个系统(调用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将存储ReferenceID列的database.table.column位置。

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

这是要做到这一点吗?有没有更好的办法?我们是否应该重新考虑一般背后的推理?

+1

我已经对足够多的“融合”和“凤凰”项目名称进行了研究,他们已经成为“失败”的代名词。 – Joe 2009-11-09 17:58:01

+0

翻转那个皱眉:) – 2009-11-10 09:37:14

+1

乔,系统的名字对于答案是非常重要的。这是关键元数据,应该是所有问题的必需字段。 – 2011-02-07 22:31:47

回答

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 
0

为什么不只是使用schema.tablename和rowid?

+0

Rowid? SQL Server没有返回Rowid afaik的方法。我认为你是一个神谕者。 – 2011-02-07 22:45:10

+0

:点头:你听起来很糟糕,哈哈。 – PaulJWilliams 2011-02-08 10:59:38

0

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

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

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

  • 为应用程序添加一列。如果多个东西使用同一个对象,那么这次可以知道哪一个是做的。

  • 为err列添加一列。你有时可能想要清楚地跟踪数据,有时候还想汇总?

  • 我想这是所有活动的“这个”SQL实例。我不建议在另一个SQL实例中的一个SQL实例上记录活动,特别是如果托管在另一个服务器上。

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

我的想法中的共同点是规范化。我不会在一列中包含太多的数据(如数据库,表格,列),因为 - 根据您想要从日志记录中取消什么 - 可能会使后续查询非常尴尬。

相关问题