【问题标题】:Database table structure and logic数据库表结构和逻辑
【发布时间】:2015-01-08 20:00:58
【问题描述】:

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

任何人都可以帮助我如何在表格结构中或在显示用户特定的值时处理这种情况。?我的数据库在 sql server 2012 中

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    如果用户在数据库级别是可识别的,您可以按照以下方式进行操作:

    您创建常用表和包含用户自定义的表:

    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
    )
    

    然后您创建一个视图,所有交互现在都应通过该视图进行,而不是表格:

    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()
    

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

    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 函数之一将是正确的。

    【讨论】:

    • 这是唯一的方法还是我们可以用其他方法代替触发器?
    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2010-12-26
    • 2017-01-28
    相关资源
    最近更新 更多