You can do something along these lines, if the users are identifiable down at the database level:
You create you usual table plus a table containing user customizations:
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
)
You then create a view through which all interactions should now occur, instead of the table:
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()
And then a couple of triggers to make sure things are appropriately maintained:
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);
So basically, each users customizations are stored as separate rows and the base table contains the "default" value that users will see unless they've applied a customization.
Depending on what authentication options are being used, SUSER_NAME may not be the correct function but one of the other various USER functions will be.