AnPv2/SQLServer/AnP.1.11.groups.server.sql

345 lines
12 KiB
Transact-SQL

use AnP
if object_id(N'dbo.groups_tables_delete', N'P') is not null drop procedure dbo.groups_tables_delete
go
create procedure dbo.groups_tables_delete as begin
set nocount on;
-- Level 3.
if object_id(N'dbo.GroupsIps', N'U') is not null drop table dbo.GroupsIps
if object_id(N'dbo.GroupsUsers', N'U') is not null drop table dbo.GroupsUsers
-- Level 1.
if object_id(N'dbo.Groups', N'U') is not null drop table dbo.Groups
-- Level 0.
if object_id(N'dbo.GroupsTypes', N'U') is not null drop table dbo.GroupsTypes
-- Level historical.
if object_id(N'dbo.GroupsIpsData', N'U') is not null drop table dbo.GroupsIpsData
if object_id(N'dbo.GroupsUsersData', N'U') is not null drop table dbo.GroupsUsersData
if object_id(N'dbo.GroupsData', N'U') is not null drop table dbo.GroupsData
if object_id(N'dbo.GroupsTypesData', N'U') is not null drop table dbo.GroupsTypesData
end
go
if object_id(N'dbo.groups_tables_create', N'P') is not null drop procedure dbo.groups_tables_create
go
create procedure dbo.groups_tables_create as begin
set nocount on;
-- Level historical.
if object_id(N'dbo.GroupsTypesData', N'U') is null create table dbo.GroupsTypesData(
id integer not null identity(1,1),
entity integer not null,
[name] varchar(32) not null,
[description] varchar(256),
date_in datetime not null,
date_out datetime,
constraint pk_groups_types primary key clustered(id)
)
if object_id(N'dbo.GroupsData', N'U') is null create table dbo.GroupsData(
id integer not null identity(1,1),
entity integer not null,
[procedure] integer not null,
[session] integer not null,
[type] integer not null,
[name] varchar(32) not null,
[description] varchar(256),
date_in datetime not null,
date_out datetime,
constraint pk_groups_data primary key clustered (id)
)
if object_id(N'dbo.GroupsIpsData', N'U') is null create table dbo.GroupsIpsData(
id integer not null identity(1,1),
entity integer not null,
[procedure] integer not null,
[session] integer not null,
[group] integer not null,
[ip] integer not null,
belongs bit not null,
date_in datetime not null,
constraint pk_groups_ips_data primary key clustered (id)
)
if object_id(N'dbo.GroupsUsersData', N'U') is null create table dbo.GroupsUsersData(
id integer not null identity(1,1),
entity integer not null,
[procedure] integer not null,
[session] integer not null,
[group] integer not null,
[user] integer not null,
belongs bit not null,
date_in datetime not null,
constraint pk_groups_users_data primary key clustered (id)
)
-- Level 0.
if object_id(N'dbo.GroupsTypes', N'U') is null create table dbo.GroupsTypes(
id integer not null identity(1,1),
[name] varchar(32) not null,
[description] varchar(256),
date_in datetime not null constraint df_groups_types_date_in default getdate(),
date_out datetime,
constraint pk_groups_types primary key clustered (id),
constraint uk_groups_types_name unique nonclustered ([name] asc) with (fillfactor = 90),
constraint ck_groups_types_name check ([name] != '')
)
-- Level 1.
if object_id(N'dbo.Groups', N'U') is null begin
create table dbo.Groups(
id integer not null identity(1,1),
[type] integer not null,
[name] varchar(32) not null,
[description] varchar(256),
date_in datetime not null constraint df_groups_date_in default getdate(),
date_out datetime,
constraint pk_groups primary key clustered (id),
constraint fk_groups_type foreign key ([type]) references dbo.GroupsTypes(id),
constraint uk_groups_type_name unique([name], [type]),
constraint ck_groups_type check ([type] > 0),
constraint ck_groups_name check ([name] != '')
)
create nonclustered index ix_groups_type on dbo.Groups([type] asc) include ([name]) with (fillfactor = 90)
create nonclustered index ix_groups_name on dbo.Groups([name] asc) include ([type]) with (fillfactor = 90)
end
-- Level 2.
if object_id(N'dbo.GroupsIps', N'U') is null begin
create table dbo.GroupsIps(
id integer not null identity(1,1),
[group] integer not null,
[ip] integer not null,
belongs bit not null constraint df_groups_ips_belongs default 1,
date_in datetime not null constraint df_groups_ips_date_in default getdate(),
constraint pk_groups_ips primary key clustered (id),
constraint fk_groups_ips_group foreign key ([group]) references dbo.Groups(id),
constraint fk_groups_ips_ip foreign key ([ip]) references dbo.Ips(id),
constraint uk_groups_ips_group_ip unique([group], [ip]),
constraint ck_groups_ips_group check ([group] > 0),
constraint ck_groups_ips_ip check ([ip] > 0)
)
create nonclustered index ix_groups_ips_group on dbo.GroupsIps([group] asc) include ([ip], belongs) with (fillfactor = 90)
create nonclustered index ix_groups_ips_ip on dbo.GroupsIps([ip] asc) include ([group], belongs) with (fillfactor = 90)
end
if object_id(N'dbo.GroupsUsers', N'U') is null begin
create table dbo.GroupsUsers(
id integer not null identity(1,1),
[group] integer not null,
[user] integer not null,
belongs bit not null constraint df_groups_users_belongs default 1,
date_in datetime not null constraint df_groups_users_date_in default getdate(),
constraint pk_groups_users primary key clustered (id),
constraint fk_groups_users_group foreign key ([group]) references dbo.Groups(id),
constraint fk_groups_users_user foreign key ([user]) references dbo.Users(id),
constraint uk_groups_users_group_user unique([group], [user]),
constraint ck_groups_users_group check ([group] > 0),
constraint ck_groups_users_user check ([user] > 0)
)
create nonclustered index ix_groups_users_group on dbo.GroupsUsers([group] asc) include ([user], belongs) with (fillfactor = 90)
create nonclustered index ix_groups_users_user on dbo.GroupsUsers([user] asc) include ([group], belongs) with (fillfactor = 90)
end
end
go
if object_id(N'dbo.groups_tables_update', N'P') is not null drop procedure dbo.groups_tables_update
go
create procedure dbo.groups_tables_update as begin
set nocount on;
end
go
execute dbo.groups_tables_delete
go
execute dbo.groups_tables_create
go
execute dbo.groups_tables_update
go
if object_id(N'dbo.groups_trigger_update', N'TR') is not null drop trigger dbo.groups_trigger_update
go
create trigger dbo.groups_trigger_update on dbo.Groups after insert, update as begin
declare @database varchar(64)
declare @procedure varchar(64)
declare @procedure_id integer
declare @session integer
declare @id integer
declare @name varchar(32)
declare @description varchar(256)
declare @date_in datetime
declare @date_out datetime
declare groups_cursor cursor local for (
select id, [name], [description], date_in, date_out from inserted
)
set nocount on
execute dbo.sql_get @database output, @procedure output, @session output
execute dbo.procedure_get @database, @procedure, @procedure_id output
open groups_cursor
while 1 = 1 begin
fetch next from groups_cursor into @id, @procedure, @session, @name, @description, @date_in, @date_out
if @@fetch_status != 0
break
insert into dbo.GroupsData(entity, [procedure], [session], [name], [description], date_in, date_out) values
(@id, @procedure, @session, @name, @description, @date_in, @date_out)
update dbo.Groups set data_id = scope_identity() where id = @id
end
close groups_cursor
deallocate groups_cursor
end
go
if object_id(N'dbo.groups_ips_trigger_update', N'TR') is not null drop trigger dbo.groups_ips_trigger_update
go
create trigger dbo.groups_ips_trigger_update on dbo.GroupsIps after insert, update as begin
declare @database varchar(64)
declare @procedure varchar(64)
declare @procedure_id integer
declare @session integer
declare @id integer
declare @group integer
declare @ip integer
declare @belongs bit
declare @date_in datetime
declare groups_ips_cursor cursor local for (
select id, [group], [ip], belongs, date_in from inserted
)
set nocount on
execute dbo.sql_get @database output, @procedure output, @session output
execute dbo.procedure_get @database, @procedure, @procedure_id output
open groups_ips_cursor
while 1 = 1 begin
fetch next from groups_ips_cursor into @id, @group, @ip, @belongs, @date_in
if @@fetch_status != 0
break
insert into dbo.GroupsIpsData(entity, [procedure], [session], [group], [ip], belongs, date_in) values
(@id, @procedure_id, @session_id, @group, @ip, @belongs, @date_in)
end
close groups_ips_cursor
deallocate groups_ips_cursor
end
go
if object_id(N'dbo.groups_users_trigger_update', N'TR') is not null drop trigger dbo.groups_users_trigger_update
go
create trigger dbo.groups_users_trigger_update on dbo.GroupsUsers after insert, update as begin
declare @database varchar(64)
declare @procedure varchar(64)
declare @procedure_id integer
declare @session integer
declare @id integer
declare @group integer
declare @user integer
declare @belongs bit
declare @date_in datetime
declare groups_users_cursor cursor local for (
select id, [group], [user], belongs, date_in from inserted
)
set nocount on
execute dbo.sql_get @database output, @procedure output, @session output
execute dbo.procedure_get @database, @procedure, @procedure_id output
open groups_users_cursor
while 1 = 1 begin
fetch next from groups_users_cursor into @id, @procedure, @session, @group, @user, @belongs, @date_in
if @@fetch_status != 0
break
insert into dbo.GroupsUsersData(entity, [procedure], [session], [group], [user], belongs, date_in) values
(@id, @procedure, @session, @group, @user, @belongs, @date_in)
update dbo.GroupsUsers set data_id = scope_identity() where id = @id
end
close groups_users_cursor
deallocate groups_users_cursor
end
go
execute dbo.groups_tables_fill
go
if object_id(N'dbo.IpsView', N'V') is not null drop view dbo.IpsView
go
create view dbo.IpsView as select
ips.id as id,
ips.[ip] as [ip],
ips.date_in as date_in
from dbo.Ips ips
where ips.date_out is null
go
if object_id(N'dbo.UsersView', N'V') is not null drop view dbo.UsersView
go
create view dbo.UsersView as select
users.id as id,
users.nick as nick,
users.date_in as date_in
from dbo.Users users
where users.date_out is null
go
if object_id(N'dbo.GroupsView', N'V') is not null drop view dbo.GroupsView
go
create view dbo.GroupsView as select
groups.id as id,
groups.name as [name],
groups.description as [description],
groups.date_in as date_in
from dbo.Groups groups
where groups.date_out is null
go
if object_id(N'dbo.GroupsIpsView', N'V') is not null drop view dbo.GroupsIpsView
go
create view dbo.GroupsIpsView as select
groups_ips.id as id,
groups.id as group_id,
groups.[name] as [group],
ips.id as ip_id,
ips.[ip] as [ip],
isnull(groups_ips.belongs, 0) as belongs,
groups_ips.date_in as date_in
from dbo.GroupsViews groups
join dbo.IpsViews ips on 1 = 1
left join dbo.GroupsIps groups_ips on
groups_ips.[group] = groups.id
groups_ips.[ip] = ips.id
go
if object_id(N'dbo.GroupsUsersView', N'V') is not null drop view dbo.GroupsUsersView
go
create view dbo.GroupsUsersView as select
groups_users.id as id,
groups.id as group_id,
groups.[name] as [group],
users.id as user_id,
users.nick as [user],
isnull(groups_users.belongs, 0) as belongs,
groups_users.date_in as date_in
from dbo.GroupsViews groups
join dbo.UsersViews users on 1 = 1
left join dbo.GroupsUsers groups_users on
groups_users.[group] = groups.id
groups_users.[user] = users.id
go