Я работаю над проблемой колледжа, и мне нужно создать хранимую процедуру для мягкого удаления записи в одной таблице и связанных записей в других таблицах. Я пытаюсь понять, как я мог бы подойти к этому, и, следовательно, вот я здесь.
У меня есть следующие таблицы:
CREATE TABLE dbo.Customers
(
Cust_ID varchar(12) NOT NULL PRIMARY KEY,
IsDeleted bit NOT NULL DEFAULT 0,
Contact_ID varchar(12) NOT NULL FOREIGN KEY,
Status_ID varchar(12) NOT NULL FOREIGN KEY,
);
CREATE TABLE dbo.CustomerContactDetails
(
Contact_ID varchar(12) NOT NULL PRIMARY KEY,
IsDeleted bit NOT NULL DEFAULT 0,
);
CREATE TABLE dbo.CustomerStatus
(
Status_ID varchar(12) NOT NULL PRIMARY KEY,
IsDeleted bit NOT NULL DEFAULT 0,
);
CREATE TABLE dbo.AccountDetails
(
Account_ID varchar(12) NOT NULL PRIMARY KEY,
IsDeleted bit NOT NULL DEFAULT 0,
Contact_ID varchar(12) NOT NULL FOREIGN KEY,
Cust_ID varchar(12) NOT NULL FOREIGN KEY,
);
CREATE TABLE dbo.Transactions
(
Transaction_ID varchar(12) NOT NULL PRIMARY KEY,
IsDeleted bit NOT NULL DEFAULT 0,
Account_ID varchar(12) NOT NULL FOREIGN KEY,
);
CREATE TABLE dbo.Associations
(
Association_ID varchar(12) NOT NULL PRIMARY KEY,
Company_Name varchar(12) NOT NULL FOREIGN KEY, (uses Cust_ID in dbo.Customers)
IsDeleted bit DEFAULT 0 NOT NULL,
AssociatedCompany varchar(12) NOT NULL FOREIGN KEY, (uses Cust_ID in dbo.Customers)
);
Как видите, все эти таблицы имеют столбец IsDeleted
с типом данных bit
и значением по умолчанию 0 (для мягкого удаления). Я пытаюсь добиться того, чтобы при обновлении dbo.Customers(IsDeleted)
до 1-го бита следующие записи автоматически обновлялись до 1-го бита:
- dbo.CustomerContactDetails (IsDeleted)
- dbo.CustomerStatus (IsDeleted)
- dbo.AccountDetails (IsDeleted)
- dbo.Transactions (IsDeleted)
- dbo. Ассоциации (IsDeleted)
Моя первоначальная мысль - настроить хранимую процедуру, чтобы конечный пользователь мог легко обновить столбец dbo.Customers(IsDeleted)
, а затем триггер для обновления связанных записей, но я не уверен, является ли это лучшим подходом, и если так с чего начать.
Мои исследования по решению проблемы до сих пор сбили меня с толку, поскольку мне кажется, что я должен быть очень осторожным, чтобы мой код ограничивал обновление IsDeleted
столбцов ONLY в качестве стандартной хранимой процедуры / триггера повлияет на все столбцы подряд.
Любое руководство здесь очень ценится.
Отредактировано с помощью приведенного ниже (работа в процессе).
ALTER PROC [dbo].[DeleteCustomer]
(
@Cust_ID varchar(12)
) AS
set nocount on;
begin transaction
begin try
UPDATE dbo.Customers
SET IsDeleted = 1
WHERE Cust_ID = @Cust_ID
UPDATE ccd
SET IsDeleted = 1
FROM dbo.CustomerContactDetails ccd
INNER JOIN dbo.Customers C ON ccd.Contact_ID = C.Contact_ID
WHERE c.Cust_ID = @Cust_ID
UPDATE cs
SET IsDeleted = 1
FROM dbo.CustomerStatus cs
INNER JOIN dbo.Customers C ON cs.Status_ID = C.Status_ID
WHERE c.Cust_ID = @Cust_ID
UPDATE ad
SET IsDeleted = 1
FROM dbo.AccountDetails ad
INNER JOIN dbo.Customers C ON ad.Cust_ID = C.Cust_ID
WHERE c.Cust_ID = @Cust_ID
UPDATE T
SET IsDeleted = 1
FROM dbo.Transactions T
INNER JOIN dbo.AccountDetails AD ON t.Account_ID = AD.Account_ID
INNER JOIN dbo.Customers C ON ad.Cust_ID = C.Cust_ID
WHERE c.Cust_ID = @Cust_ID
UPDATE AA
SET IsDeleted = 1
FROM dbo.Associations AA
INNER JOIN dbo.Customers C ON AA.Company_Name = C.Cust_ID
OR AA.AssociatedCompany = C.Cust_ID
WHERE c.Cust_ID = @Cust_ID
end try
begin catch
rollback transaction
throw
end catch
Я успешно создал свою хранимую процедуру, но при выполнении ничего не происходит. На экране просто написано «выполняется», и так будет до тех пор, пока я не остановлю его. Есть идеи?
USE [db]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[DeleteCustomer]
@Cust_ID = N'C1'
SELECT 'Return Value' = @return_value
GO
Сообщение 266, Уровень 16, Состояние 2, Процедура DeleteCustomer, Строка 2
Число транзакций после EXECUTE указывает на несовпадающее количество операторов BEGIN и COMMIT. Предыдущий счет = 0, текущий счет = 1.