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._Sessions', N'U') is not null drop table dbo._Sessions if object_id(N'dbo.SessionsActived', N'U') is not null drop table dbo.SessionsActived if object_id(N'dbo.Sessions', N'U') is not null drop table dbo.Sessions 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.Sessions', N'U') is null create table dbo.Sessions( id integer not null identity(1, 1), [procedure] integer not null, [user] integer not null, [ip] integer not null, date_last integer not null constraint df_sessions_date_last default getdate(), date_in datetime not null constraint df_sessions_date_in default getdate(), date_out datetime, constraint pk_sessions primary key clustered(id), constraint fk_sessions_procedure foreign key([procedure]) references dbo.Procedures(id) on update no action on delete no action, constraint fk_sessions_user foreign key([user]) references dbo.Users(id) on update no action on delete no action, constraint fk_sessions_ip foreign key([ip]) references dbo.Ips(id) on update no action on delete no action ) if object_id(N'dbo.SessionsActived', N'U') is null create table dbo.SessionsActived( id integer not null, [procedure] integer not null, [user] integer not null, [ip] integer not null, date_last integer not null constraint df_sessions_date_last default getdate(), date_in datetime not null constraint df_sessions_date_in default getdate(), [timeout] integer not null constraint df_sessions_timeout default 300, constraint pk_sessions primary key clustered(id), constraint fk_sessions_procedure foreign key([procedure]) references dbo.Procedures(id) on update no action on delete no action, constraint fk_sessions_user foreign key([user]) references dbo.Users(id) on update no action on delete no action, constraint fk_sessions_ip foreign key([ip]) references dbo.Ips(id) on update no action on delete no action ) if object_id(N'dbo._Sessions', N'U') is null create table dbo._Sessions( id integer not null identity(1, 1), entity integer not null, [procedure] integer not null, [user] integer not null, [ip] integer not null, date_last integer not null, date_in datetime not null, date_out datetime, history_date datetime2 not null constraint df__sessions_history_in default sysutcdatetime(), constraint pk__sessions primary key clustered(id), constraint fk__sessions_procedure foreign key([procedure]) references dbo.Procedures(id) on update no action on delete no action, constraint fk__sessions_user foreign key([user]) references dbo.Users(id) on update no action on delete no action, constraint fk__sessions_ip foreign key([ip]) references dbo.Ips(id) on update no action on delete no action ) end go 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 execute dbo.users_tables_upgrade execute dbo.ips_tables_upgrade end go execute dbo.users_tables_create if object_id(N'dbo.sessions_actived_trigger', N'TR') is not null drop trigger dbo.sessions_actived_trigger on dbo.SessionsActived go create trigger dbo.sessions_actived_trigger on dbo.SessionsActived after insert, update, delete as begin set nocount on -- Updates. update sessions set sessions.[procedure] = inserted.[procedure], sessions.[user] = inserted.[user], sessions.[ip] = inserted.[ip], sessions.date_last = inserted.date_last, sessions.date_in = inserted.date_in from inserted inserted join dbo.Sessions sessions on inserted.id = sessions.id join deleted deleted on inserted.id = deleted.id -- Inserts. insert into dbo.Sessions(id, [procedure], [user], [ip], date_last, date_in) select inserted.id, inserted.[procedure], inserted.[user], inserted.[ip], inserted.date_last, inserted.date_in from inserted inserted left join dbo.Sessions sessions on inserted.id = sessions.id left join deleted deleted on inserted.id = deleted.id where sessions.id is null and deleted.id is null -- Deletes. update sessions set sessions.[procedure] = deleted.[procedure], sessions.[user] = deleted.[user], sessions.[ip] = deleted.[ip], sessions.date_last = deleted.date_last, sessions.date_in = deleted.date_in, sessions.date_out = getdate() from deleted deleted join dbo.Sessions sessions on deleted.id = sessions.id left join inserted inserted on deleted.id = inserted.id where inserted.id is null -- Deletes unexistent. insert into dbo.Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out) select deleted.id, deleted.[procedure], deleted.[user], deleted.[ip], deleted.date_last, deleted.date_in, getdate() from deleted deleted left join dbo.Sessions sessions on deleted.id = sessions.id left join inserted inserted on deleted.id = inserted.id where sessions.id is null and inserted.id is null end go if object_id(N'dbo.sessions_trigger', N'TR') is not null drop trigger dbo.sessions_trigger on dbo.Sessions go create trigger dbo.sessions_trigger on dbo.Sessions after insert, update, delete as begin set nocount on -- Update. insert into dbo._Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out) select inserted.id, inserted.[procedure], inserted.[user], inserted.[ip], inserted.date_last, inserted.date_in, null from inserted inserted join deleted deleted on inserted.id = deleted.id where ( inserted.[procedure] != deleted.[procedure] or inserted.[user] != deleted.[user] or inserted.[ip] != deleted.[ip] or inserted.date_last != deleted.date_last or inserted.date_in != deleted.date_in or isnull(inserted.date_out, '0001-01-01') != isnull(deleted.date_out, '0001-01-01') ) and not ( inserted.[procedure] = deleted.[procedure] and inserted.[user] = deleted.[user] and inserted.[ip] = deleted.[ip] and inserted.date_last != deleted.date_last and inserted.date_in = deleted.date_in and isnull(inserted.date_out, '0001-01-01') = isnull(deleted.date_out, '0001-01-01') ) -- Insert. insert into dbo._Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out) select inserted.id, inserted.[procedure], inserted.[user], inserted.[ip], inserted.date_last, inserted.date_in, null from inserted inserted left join deleted deleted on inserted.id = deleted.id where deleted.id is null -- Delete. insert into dbo._Sessions(id, [procedure], [user], [ip], date_last, date_in, date_out, history_out) select deleted.id, deleted.[procedure], deleted.[user], deleted.[ip], deleted.date_last, deleted.date_in, getdate(), sysutcdatetime() from deleted deleted left join inserted inserted on deleted.id = inserted.id where inserted.id is null end go if object_id(N'dbo.machine_session_get', N'FN') is not null drop function dbo.machine_session_get go create function machine_session_get() returns integer begin return ( select top 1 sessions.id from dbo.Sessions sessions join dbo.Users users on users.id = sessions.[user] where date_out is null and users.nick = 'machine' ) end go