首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库表结构与逻辑

数据库表结构与逻辑
EN

Stack Overflow用户
提问于 2015-01-08 10:45:32
回答 1查看 58关注 0票数 0

我有个设想。我有一个属性表,它有许多字段,包括属性大小。因此,如果某个属性的大小为5,那么在属性表中,它将显示5,但是如果用户认为它的大小不是5,而是它的6。所以我想处理该用户,将其大小保存为6,但不更改原始值(即5)。此外,如果用户获得该属性记录,它将显示该用户的6大小,但对于所有其他用户,它将显示5大小。

有谁能帮助我在表结构中或在显示特定于用户的值时处理这个场景吗?我的数据库位于sql server 2012中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-08 12:00:58

如果在数据库级别上可以识别用户,则可以按照这些思路进行如下操作:

您可以创建通常的表加上一个包含用户自定义的表:

代码语言:javascript
复制
create table dbo.T (
    ID varchar(19) not null primary key,
    PropertySize int not null
)
go
create table dbo.T_User (
    ID varchar(19) not null,
    [User] sysname not null,
    PropertySize int null
)

然后创建一个视图,通过该视图进行所有交互,而不是表:

代码语言:javascript
复制
create view dbo.V
with schemabinding
as
    select
        t.ID,
        ISNULL(u.PropertySize,t.PropertySize) as PropertySize
    from
        dbo.T t
            left join
        dbo.T_User u
            on
                t.ID = u.ID and
                u.[User] = SUSER_NAME()

然后用几个触发器来确保事情得到适当的维护:

代码语言:javascript
复制
create trigger T_V_I on dbo.V instead of insert
as
    insert into dbo.T (ID,PropertySize) select ID,PropertySize from inserted
go
create trigger T_V_U on dbo.V instead of update
as
    merge into dbo.T_User u
    using inserted s
    on u.ID = s.ID
    when matched then update set PropertySize= s.PropertySize
    when not matched then insert (ID,[User],PropertySize) values (s.ID,SUSER_NAME(),s.PropertySize);

因此,基本上,每个用户自定义都存储为单独的行,并且基表包含用户将看到的“默认值”值,除非他们已经应用了自定义。

根据所使用的身份验证选项,SUSER_NAME可能不是正确的函数,而是其他各种USER函数中的一个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27838217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档