Переключение фокуса базы во время исполнения скрипта SQL в SMSS
ALL! Сегодня, выполняя рабочее задание, столкнулся с какой-то дичью - скрипт SQL во время исполнения переключился на другую (продакшн) базу, где были такие же таблицы и начал удалять записи. Когда мой шеф сказал, что что-то не то происходит я не поверил сначала, но когда начали сверять базу с бэкапом всё стало очевидно. Как такое могло произойти? MS SQL 2008 R2, скрипт ниже
use WHD
go
declare @terminator_date datetime = '2020-01-01';
declare @temp table (Table_Name nvarchar(50), Rows_before int null, Rows_after int null);
declare @transaction_id_list table (Row_id int not null);
--counting rows BEFORE deleting
insert into @temp (Table_Name, Rows_before, Rows_after) select N'hdr_PackingList', (select COUNT(*) from hdr_PackingList), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'tbl_PackingList', (select COUNT(*) from tbl_PackingList), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'hdr_Delivery', (select COUNT(*) from hdr_Delivery), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'hdr_DeliveryRequest', (select COUNT(*) from hdr_DeliveryRequest), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'tbl_DeliveryRequestMaterials', (select COUNT(*) from tbl_DeliveryRequestMaterials), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'hdr_MaterialReplenishment', (select COUNT(*) from hdr_MaterialReplenishment), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'ManualAllocationLog', (select COUNT(*) from ManualAllocationLog), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'BarcodeObjects', (select COUNT(*) from BarcodeObjects), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'ConveyCtrl_Log', (select COUNT(*) from ConveyCtrl_Log), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'hdr_MaterialPicking', (select COUNT(*) from hdr_MaterialPicking), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'StorageObjects', (select COUNT(*) from StorageObjects), 0;
insert into @temp (Table_Name, Rows_before, Rows_after) select N'Transactions', (select COUNT(*) from Transactions), 0;
insert into @transaction_id_list (Row_id) select tid from Transactions where CreationDate < @terminator_date;
--deleting records
delete hdr_PackingList from hdr_PackingList inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete tbl_PackingList from tbl_PackingList inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete hdr_Delivery from hdr_Delivery inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete hdr_DeliveryRequest from hdr_DeliveryRequest inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete tbl_DeliveryRequestMaterials from tbl_DeliveryRequestMaterials inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete hdr_MaterialReplenishment from hdr_MaterialReplenishment inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete ManualAllocationLog from ManualAllocationLog inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete from BarcodeObjects where IncomeDate < @terminator_date;
delete from ConveyCtrl_Log where RecordDate < @terminator_date;
select a.tid from storageobjects as a
left join tbl_PackingList as d on a.tid = d.StorageObject_id
left join hdr_MaterialPicking as e on a.tid = e.TargetStorageObject_id
left join hdr_ObjectMovement as f on a.tid = f.StorageObject_id
where d.tid is null
and e.tid is null
and f.tid is null
delete hdr_MaterialPicking from hdr_MaterialPicking inner join @transaction_id_list AS tr_id ON Transaction_id = tr_id.Row_id;
delete Transactions from Transactions AS trans_tbl inner join @transaction_id_list AS tr_id ON trans_tbl.tid = tr_id.Row_id;
--counting rows AFTER deleting
update @temp set Rows_after = (select COUNT(*) from hdr_PackingList) where Table_Name = N'hdr_PackingList';
update @temp set Rows_after = (select COUNT(*) from tbl_PackingList) where Table_Name = N'tbl_PackingList';
update @temp set Rows_after = (select COUNT(*) from hdr_Delivery) where Table_Name = N'hdr_Delivery';
update @temp set Rows_after = (select COUNT(*) from hdr_DeliveryRequest) where Table_Name = N'hdr_DeliveryRequest';
update @temp set Rows_after = (select COUNT(*) from tbl_DeliveryRequestMaterials) where Table_Name = N'tbl_DeliveryRequestMaterials';
update @temp set Rows_after = (select COUNT(*) from hdr_MaterialReplenishment) where Table_Name = N'hdr_MaterialReplenishment';
update @temp set Rows_after = (select COUNT(*) from ManualAllocationLog) where Table_Name = N'ManualAllocationLog';
update @temp set Rows_after = (select COUNT(*) from BarcodeObjects) where Table_Name = N'BarcodeObjects';
update @temp set Rows_after = (select COUNT(*) from ConveyCtrl_Log) where Table_Name = N'ConveyCtrl_Log';
update @temp set Rows_after = (select COUNT(*) from hdr_MaterialPicking) where Table_Name = N'hdr_MaterialPicking';
update @temp set Rows_after = (select COUNT(*) from StorageObjects) where Table_Name = N'StorageObjects';
update @temp set Rows_after = (select COUNT(*) from Transactions) where Table_Name = N'Transactions';
select * from @temp;```