如果用户在数据库级别是可识别的,您可以按照以下方式进行操作:
您创建常用表和包含用户自定义的表:
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 函数之一将是正确的。