小编Dan*_*Dan的帖子

在 SQL Server 2008 R2 中为实体设计批准队列和审计跟踪的最佳方法是什么?

简化说明:我有三个主要表:customer、phone 和customer_phone 来解决多对多问题。我需要确保只有管理员才能在未经批准的情况下插入/更新这些表。其他所有人都需要将他们的东西放入批准队列,以便管理员批准。管理员需要在批准/拒绝之前查看当前值和提议的更改。系统应该在审计跟踪中记录谁提交了信息,谁批准了它(如果适用),以及任何修改它的人。当前采用的方法为每个实体提供三个表:

  1. 主实体表
  2. 未批准记录的保存表
  3. 每个实体的审计日志表

我认为应该有一些更简单的解决方案。当前系统在以下情况下存在问题:

  • 管理员在主实体被批准之前尝试批准一个实体,它链接到
  • 该记录已存在于数据库中,但需要批准将其链接到另一条记录

这对我来说似乎不是最佳解决方案。有没有更好的办法?

更长的解释:这是场景的简化视图:我有一个主要实体和次要实体通过链接表链接到它。管理员可以随意添加/编辑任何实体,但标准用户必须在更改生效之前获得管理员的批准。问题是,有时当标准用户输入主实体和链接实体时,管理员必须先批准主实体,链接才能生效。我希望管理员能够在批准之前查看旧值和提议的新值,并且我希望确保他们首先批准主要实体。例如,假设我们有下表,客户是主要实体,电话是次要实体,然后有一个链接表来解决多对多关系:

CREATE TABLE [dbo].[customer](
  [Customer_ID] [int] NOT NULL,
  [Customer_Name] [varchar](255) NOT NULL,
PRIMARY KEY CLUSTERED ([Customer_ID] ASC)

CREATE TABLE [dbo].[phone](
  [Phone_ID] [int] NOT NULL,
  [Phone_Number] [int] NOT NULL,
PRIMARY KEY CLUSTERED ([Phone_ID] ASC)

CREATE TABLE [dbo].[customer_phone](
  [Customer_Phone_ID] [int] NOT NULL,
  [Customer_ID] [int] NOT NULL,
  [Phone_ID] [int] NOT NULL,
  [Approved] [char](1) NOT NULL, --Y/N
PRIMARY KEY CLUSTERED ([Phone_ID] ASC)
Run Code Online (Sandbox Code Playgroud)

现在,只有管理员才能在未经批准的情况下添加客户或电话号码。如果标准用户想要添加某人,它会进入一个保留表。这就是目前在我的系统中的样子。除了以上表格:

CREATE TABLE [dbo].[customer_holding](
  [Customer_ID] [int] NOT NULL,
  [Customer_Name] [varchar](255) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 best-practices

6
推荐指数
1
解决办法
2953
查看次数

计算所有用户最近使用的浏览器

我有一个带有列Type, Login,Timestamp. 已收集有关用户登录到与系统浏览器的类型信息。显然,许多用户已经升级了他们的浏览器。当用户升级时,我不想考虑旧浏览器的数据。这是我目前必须计算有多少人使用哪种浏览器的查询:

select 
  Type, 
  count(Type) as Count 
from 
  (select 
    distinct Login, 
    Type 
   from BROWSER) as q 
group by Type
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但我有很多我知道不再使用的旧浏览器:

yucky - 没有人使用的旧浏览器

我如何仅根据时间戳选择每个用户使用的最新浏览器(或者 Browser_ID 也可以工作,因为它们是按顺序编写的)。我也打算忽略过去一年中没有登录的用户的数据,但这很容易在以后添加(我只是提到它,所以没有人提出为什么我想要不活跃用户的旧浏览器数据 - 我也计划解决这个问题,但我已经知道如何做到这一点)。

如果有人愿意接受挑战,有些用户会从几台不同的计算机登录 - 或者可能是从他们的电话和办公桌上登录。如果我能确定他们经常从两个不同的地方登录并收集这些数据,那就太好了,但这可能太复杂了。如果有人想出如何添加这个复杂的步骤,我很乐意为答案奖励 50 分。

sql-server-2008-r2

5
推荐指数
1
解决办法
153
查看次数

如何根据序列 ID 选择最近更新的行

我有一个主 ID 列,但对于该行的每次编辑,还有一个序列 ID 列(初始行为 1,每次编辑都会增加序列 ID,但主 ID 列保持不变)。在查询中仅选择最新(最大序列 ID)行的最佳方法是什么?我目前以编程方式执行此操作,但想知道是否有办法在使用 SQL 的一个查询中完成所有操作。

样本数据:

Person_ID   Person_Seq_ID   Person_Name   Person_Favorite_Color
---------   -------------   -----------   ---------------------
1           1               John Doe      Green
1           2               John Doe      Turquoise
2           1               Jane Doe      Blue
3           1               Mike Smith    Red
Run Code Online (Sandbox Code Playgroud)

假设我有这个查询:

SELECT * FROM Person
Run Code Online (Sandbox Code Playgroud)

我只希望John Doe返回最近的行(在本例中为序列 ID #2),并且还应返回 Jane 和 Mike 的单行。

预期结果:

Person_ID   Person_Seq_ID   Person_Name   Person_Favorite_Color
---------   -------------   -----------   ---------------------
1           2               John Doe      Turquoise
2           1               Jane Doe      Blue
3           1               Mike Smith    Red …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008-r2

2
推荐指数
1
解决办法
1351
查看次数