-- изменяем модель принадлежности и обслуживания объектов электроснабжения, добавляем таблицу для суррогатных PowerObject
EXEC sp_rename 'PowerObjectOwners', 'Delineations' 
GO
create table OwnershipForms
(
	ID 		int identity(1,1),
	Description	nvarchar(100),
	PRIMARY KEY (ID)	
)
GO

create table UsageForms
(
	ID 		int identity(1,1),
	Description	nvarchar(100),
	PRIMARY KEY (ID)	
)
GO
create table PseudoObjects
(
	PseudoObjectID	int identity(1,1),
	Name		nvarchar(200) NOT NULL,
	PRIMARY KEY(PseudoObjectID)
)
GO
create table PowerObjectOwners
(
	OwnerID int identity(1,1),
	PowerObjectID	int NULL,
	PseudoObjectID	int NULL,
	LegalEntityID	int NOT NULL,
	OwnershipFormID	int,
	PRIMARY KEY(OwnerID)
)
GO
ALTER TABLE PowerObjectOwners
	ADD FOREIGN KEY (PowerObjectID)
	REFERENCES Объект(Код_объекта)
	ON DELETE CASCADE

ALTER TABLE PowerObjectOwners
	ADD FOREIGN KEY (PseudoObjectID)
	REFERENCES PseudoObjects(PseudoObjectID)
	ON DELETE CASCADE

ALTER TABLE PowerObjectOwners
	ADD FOREIGN KEY (LegalEntityID)
	REFERENCES LegalEntities(LegalEntityID)

ALTER TABLE PowerObjectOwners
	ADD FOREIGN KEY (OwnershipFormID)
	REFERENCES OwnershipForms(ID)

GO
create table PowerObjectUsers
(
	UserID int identity(1,1),
	PowerObjectID	int NULL,
	PseudoObjectID	int NULL,
	LegalEntityID	int NOT NULL,
	UsageFormID	int,
	PRIMARY KEY(UserID)
)
GO
ALTER TABLE PowerObjectUsers
	ADD FOREIGN KEY (PowerObjectID)
	REFERENCES Объект(Код_объекта) 
	ON DELETE CASCADE

ALTER TABLE PowerObjectUsers
	ADD FOREIGN KEY (PseudoObjectID)
	REFERENCES PseudoObjects(PseudoObjectID) 
	ON DELETE CASCADE

ALTER TABLE PowerObjectUsers
	ADD FOREIGN KEY (LegalEntityID)
	REFERENCES LegalEntities(LegalEntityID)

ALTER TABLE PowerObjectUsers
	ADD FOREIGN KEY (UsageFormID)
	REFERENCES UsageForms(ID)
GO
-- переносим данные из Объект
insert into PowerObjectOwners(PowerObjectID, LegalEntityID) select Код_объекта, Код_организации_владельца from Объект where Код_организации_владельца is not null
insert into PowerObjectUsers(PowerObjectID, LegalEntityID) select Код_объекта, Код_обслуживающей_организации from Объект where Код_обслуживающей_организации is not null
GO
-- заполняем справочники
SET IDENTITY_INSERT OwnershipForms ON
insert into OwnershipForms(ID, Description) values (1, 'собственник')
insert into OwnershipForms(ID, Description) values (2, 'балансодержатель')
insert into OwnershipForms(ID, Description) values (3, 'арендодатель')
insert into OwnershipForms(ID, Description) values (4, 'арендатор')
insert into OwnershipForms(ID, Description) values (5, 'субарендатор')
SET IDENTITY_INSERT OwnershipForms OFF
GO
SET IDENTITY_INSERT UsageForms ON
insert into UsageForms(ID, Description) values (1, 'эксплуатирует')
insert into UsageForms(ID, Description) values (2, 'обслуживает')
SET IDENTITY_INSERT UsageForms OFF
GO
-- убираем старые связи
delete from Delineations
GO
declare @table_name nvarchar(50)
declare @strSQL nvarchar(1024)

set @table_name=N'Объект'
set @strSQL=''
select @strSQL = @strSQL + ' ALTER TABLE ' + @table_name + ' DROP CONSTRAINT '+ object_name(FK_Tab.id) 
from sysobjects FK_Tab 
where (xtype = 'F') AND object_id(@table_name)=parent_obj 

if @strSQL<>''  exec (@strSQL)
GO
ALTER TABLE Объект
        ADD FOREIGN KEY (Код_типа_объекта)
                              REFERENCES Справочник_типов_объектов

ALTER TABLE Объект
        ADD FOREIGN KEY (Код_диспетчерского_управления)
                              REFERENCES Диспетчерское_управление

ALTER TABLE Объект WITH NOCHECK 
        ADD FOREIGN KEY (Код_объекта_владельца)
                              REFERENCES Объект

GO
ALTER VIEW ExistingObjects
    WITH SCHEMABINDING
    AS
    SELECT 
           Код_объекта,
            Код_типа_объекта,     
            Код_диспетчерского_управления, 
            Наименование,         
            Код_объекта_владельца,
        Инвентарный_номер,    
        Примечание,         
        GUID,             
            Балансовая_стоимость, 
            Порядковый_номер,
                Номер_документа,
                Дата_документа
        В_проекте     
    FROM dbo.Объект
    WHERE В_проекте = 0
    WITH CHECK OPTION
GO
ALTER VIEW DesignObjects
    WITH SCHEMABINDING
    AS
    SELECT 
           Код_объекта,
            Код_типа_объекта,     
            Код_диспетчерского_управления, 
            Наименование,         
            Код_объекта_владельца,
        Инвентарный_номер,    
        Примечание,         
        GUID,             
            Балансовая_стоимость, 
            Порядковый_номер,
                Номер_документа,
                Дата_документа
         В_проекте     
    FROM dbo.Объект
    WHERE В_проекте = 1
    WITH CHECK OPTION
GO
alter table Объект drop column Код_организации_владельца
alter table Объект drop column Код_обслуживающей_организации
GO
-- переделываем таблицы для хранения списков соответствия
delete from Delineations
GO
declare @table_name nvarchar(50)
declare @strSQL nvarchar(1024)

set @table_name=N'Delineations'
set @strSQL=''
select @strSQL = @strSQL + ' ALTER TABLE ' + @table_name + ' DROP CONSTRAINT '+ object_name(FK_Tab.id) 
from sysobjects FK_Tab 
where (xtype = 'F') AND object_id(@table_name)=parent_obj 

if @strSQL<>''  exec (@strSQL)

GO
alter table Delineations drop column Caption
alter table Delineations drop column LegalEntityID
alter table Delineations add PseudoRefID int
GO
--ALTER TABLE Delineations
--	ADD PRIMARY KEY (ItemNum)

ALTER TABLE Delineations
	ADD FOREIGN KEY (ConsumingObjectID)
	REFERENCES ConsumingObjects(ID)
	ON DELETE CASCADE
        ON UPDATE CASCADE

ALTER TABLE Delineations
	ADD FOREIGN KEY (RefID)
	REFERENCES Объект(Код_объекта)
	ON DELETE CASCADE

ALTER TABLE Delineations
	ADD FOREIGN KEY (PseudoRefID)
	REFERENCES PseudoObjects(PseudoObjectID)
	ON DELETE CASCADE

