实现每个用户的独特价值,包括全球用户

时间:2017-10-18 14:29:05

标签: sql-server sql-server-2008-r2

我有一个应用程序,用户可以在其中创建自己的自定义私有标记,但也有一些固定的系统范围的常用标记。标签存储在数据库表中,其中常见标签是USER_IDNULL的标签。

CREATE TABLE TAG (
    TAG_ID INT IDENTITY(1, 1) NOT NULL,
    TAG_NAME VARCHAR(40) NOT NULL,
    USER_ID INT,

    CONSTRAINT TAG_PK PRIMARY KEY (TAG_ID),

    CONSTRAINT TAG_FK1 FOREIGN KEY (USER_ID)
    REFERENCES [USER] (USER_ID)
);
CREATE INDEX TAG_IDX1 ON TAG (USER_ID);

我想在数据库级别强制执行标记对每个用户都是唯一的,这意味着:

  • 用户可能只有一个具有给定名称的标签,但其他客户也可能拥有自己的带有此名称的标签。

  • 常用代码也应该计算在内,因此用户无法创建已经常用的代码。

像这样的简单索引不起作用,因为它只能防止组内的欺骗(每个用户使用常见标记) - 仍然可以将公共标记重新创建为用户标记:

CREATE UNIQUE INDEX TAG_UK1 ON TAG (TAG_NAME, USER_ID);

我相信SQL Server不允许在索引中使用表达式,例如:

-- Incorrect syntax near the keyword 'COALESCE'.
CREATE UNIQUE INDEX TAG_UK1 ON TAG (TAG_NAME, COALESCE(USER_ID, 'COMMON'));

你能想到其他一些方法吗?

1 个答案:

答案 0 :(得分:0)

可能需要用触发器来处理这个问题。

如果插入或更新新的全局标记,则在标记表中。您需要检查每个用户是否已经拥有该标签并将其转换为全局

例如,您有Angular作为标记,但有些用户是头脑并创建Angular4。当Angular4成为全局代码时,您需要将其从所有用户中删除。

为用户创建标记相同,您可以检查全局是否已有该标记并引发错误。