AnP/SQLServer/AnP.02.users.server.sql
2026-07-13 07:51:35 +02:00

120 lines
5.3 KiB
Transact-SQL

use AnP
if object_id(N'dbo.users_tables_remove', N'P') is not null drop procedure dbo.users_tables_remove
go
create procedure dbo.users_tables_remove as begin set nocount on
if object_id(N'dbo._Users', N'U') is not null drop table dbo._Users
if object_id(N'dbo.Users', N'U') is not null drop table dbo.Users
end
go
if object_id(N'dbo.users_tables_create', N'P') is not null drop procedure dbo.users_tables_create
go
create procedure dbo.users_tables_create as begin set nocount on
if object_id(N'dbo.Users', N'U') is null create table dbo.Users(
id integer not null identity(1, 1),
[procedure] integer not null,
[session] integer not null,
nick varchar(32) not null,
[password] varbinary(64) not null,
accessible bit not null constraint df_users_accessible default 1,
date_in datetime2 not null constraint df_users_date_in default getdate(),
date_out datetime2,
constraint pk_users primary key clustered(id),
constraint fk_users_procedure foreign key([procedure]) references dbo.Procedures(id)
on update no action
on delete no action,
constraint uq_users_nick unique(nick) with(fillfactor = 90),
constraint ck_users_nick check(nick != '' and nick not like '%[^a-zA-Z0-9_]%' and nick not like '[^a-zA-Z_]%'),
constraint ck_users_password check(datalength([password]) > 0)
)
if object_id(N'dbo._Users', N'U') is null create table dbo._Users(
id integer not null identity(1, 1),
history_mode integer not null,
entity integer not null,
[procedure] integer not null,
[session] integer not null,
nick varchar(32) not null,
[password] varbinary(64) not null,
accessible bit not null,
date_in datetime2 not null,
date_out datetime2,
history_date datetime2 not null constraint df__users_history_date default sysutcdatetime(),
constraint pk__users primary key clustered(id),
constraint fk__users_history_mode foreign key(history_mode) references dbo.HistoryModes(id)
on update no action
on delete no action,
constraint fk__users_procedure foreign key([procedure]) references dbo.Procedures(id)
on update no action
on delete no action,
index ix__users_history nonclustered(entity, history_date)
)
end
go
execute dbo.users_tables_create
if object_id(N'dbo.users_tables_upgrade', N'P') is not null drop procedure dbo.users_tables_upgrade
go
create procedure dbo.users_tables_upgrade as begin set nocount on
if (select top 1 0 from information_schema.table_constraints where
table_catalog = db_name() and
table_name = 'Users' and
constraint_name = 'fk_users_session'
) is null alter table dbo.Users add constraint fk_users_session foreign key([session]) references dbo.Sessions(id)
on update no action
on delete no action
if (select top 1 0 from information_schema.table_constraints where
table_catalog = db_name() and
table_name = '_Users' and
constraint_name = 'fk__users_session'
) is null alter table dbo._Users add constraint fk__users_session foreign key([session]) references dbo.Sessions(id)
on update no action
on delete no action
end
go
if object_id(N'dbo.users_trigger', N'TR') is not null drop trigger dbo.users_trigger
go
create trigger dbo.users_trigger on dbo.Users for insert, update, delete as begin set nocount on
declare @insert integer, @update integer, @delete integer, @unknown integer
execute dbo.history_mode_get @insert output, @update output, @delete output, @unknown output
-- update.
insert into dbo._Users(history_mode, entity, [procedure], [session], nick, [password], accessible, date_in, date_out)
select @update, inserted.id, inserted.[procedure], inserted.[session], inserted.nick, inserted.[password], inserted.accessible, inserted.date_in, inserted.date_out
from inserted inserted
join deleted deleted on inserted.id = deleted.id
where
inserted.[procedure] != deleted.[procedure] or
inserted.[session] != deleted.[session] or
inserted.nick != deleted.nick or
inserted.[password] != deleted.[password] or
inserted.accessible != deleted.accessible or
inserted.date_in != deleted.date_in or
isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01')
-- Insert.
insert into dbo._Users(history_mode, entity, [procedure], [session], nick, [password], accessible, date_in, date_out)
select @insert, inserted.id, inserted.[procedure], inserted.[session], inserted.nick, inserted.[password], inserted.accessible, inserted.date_in, inserted.date_out
from inserted inserted
left join deleted deleted on inserted.id = deleted.id
where deleted.id is null
-- deleted.
insert into dbo._Users(history_mode, entity, [procedure], [session], nick, [password], accessible, date_in, date_out)
select @delete, deleted.id, deleted.[procedure], deleted.[session], deleted.nick, deleted.[password], deleted.accessible, deleted.date_in, deleted.date_out
from deleted deleted
left join inserted inserted on deleted.id = inserted.id
where inserted.id is null
end
go