我有一个应用程序,用户可以在其中创建自己的自定义私有标记,但也有一些固定的系统范围的常用标记。标签存储在数据库表中,其中常见标签是USER_ID
为NULL
的标签。
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'));
你能想到其他一些方法吗?
答案 0 :(得分:0)
可能需要用触发器来处理这个问题。
如果插入或更新新的全局标记,则在标记表中。您需要检查每个用户是否已经拥有该标签并将其转换为全局
例如,您有Angular
作为标记,但有些用户是头脑并创建Angular4
。当Angular4
成为全局代码时,您需要将其从所有用户中删除。
为用户创建标记相同,您可以检查全局是否已有该标记并引发错误。