Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Иерархический апдейт  [new]
Werty
Member

Откуда:
Сообщений: 145
Например есть 3 сущности:

1. Firm, поля ID, Name, IsDeleted
2. Department, поля ID, Name, FirmID, IsDeleted
3. User, поля ID, Name, DepartmentID, IsDeleted

Процедуры по удалению Firm/Department/User

UPDATE dbo.Firm --/Department/User
SET IsDeleted = 1
WHERE ID = @ID

Как производить фиктивное удаление (SET IsDeleted = 1) по иерархии (каскадно), т. е. при вызове процедуры DeleteFirm, надо вызвать процедуры для всех отделов в ней, и для всех пользователей в отделах.

Варианты:
1. Внутри процедуры DeleteFirm встроить 2 UPDATE для Department и User - проблема внесения изменений
2. Вызывать в курсоре процедуру DeleteDepartment, в ней курсором DeleteUser - проблема с @@FETCH_STATUS

Может быть есть какие-то другие варианты, например иерархических вызов процедур в слое данных.
16 ноя 09, 13:09    [7933386]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Glory
Member

Откуда:
Сообщений: 104760
Werty

Варианты:
1. Внутри процедуры DeleteFirm встроить 2 UPDATE для Department и User - проблема внесения изменений
2. Вызывать в курсоре процедуру DeleteDepartment, в ней курсором DeleteUser - проблема с @@FETCH_STATUS

1. И какие же там "проблема внесения изменений" ?
2. И что за "проблема с @@FETCH_STATUS" ?
16 ноя 09, 13:13    [7933411]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Странная структура. IMHO
User может быть связан только с одним Department и с одной Firm?
Это почему же так?

По поводу "удаления" - можно рассмотреть триггер INSTEAD OF DELETE, например.
16 ноя 09, 13:19    [7933471]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Werty
Member

Откуда:
Сообщений: 145
Glory
Werty

Варианты:
1. Внутри процедуры DeleteFirm встроить 2 UPDATE для Department и User - проблема внесения изменений
2. Вызывать в курсоре процедуру DeleteDepartment, в ней курсором DeleteUser - проблема с @@FETCH_STATUS

1. И какие же там "проблема внесения изменений" ?
2. И что за "проблема с @@FETCH_STATUS" ?


1. Если будут изменения, то придется вносить их не в одну, а в несколько процедур.
2. http://msdn.microsoft.com/ru-ru/library/ms187308.aspx Смутило:

Например, пользователь выполняет инструкцию FETCH из одного курсора, а затем вызывает хранимую процедуру, которая открывает и обрабатывает результаты из другого курсора. Когда управление возвращается от вызванной хранимой процедуры, функция @@FETCH_STATUS отражает результаты последней инструкции FETCH, выполненной в хранимой процедуре, а не результаты инструкции FETCH, выполненной прежде, чем была вызвана хранимая процедура.
16 ноя 09, 13:27    [7933535]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Werty
Member

Откуда:
Сообщений: 145
iap
Странная структура. IMHO
User может быть связан только с одним Department и с одной Firm?
Это почему же так?

По поводу "удаления" - можно рассмотреть триггер INSTEAD OF DELETE, например.


Структуру придумал от балды :-) Интересен механизм такого "удаления". На счет триггера INSTEAD OF DELETE спасибо, подумаю.
16 ноя 09, 13:29    [7933553]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Glory
Member

Откуда:
Сообщений: 104760
Werty


1. Если будут изменения, то придется вносить их не в одну, а в несколько процедур.
2. http://msdn.microsoft.com/ru-ru/library/ms187308.aspx Смутило:

Например, пользователь выполняет инструкцию FETCH из одного курсора, а затем вызывает хранимую процедуру, которая открывает и обрабатывает результаты из другого курсора. Когда управление возвращается от вызванной хранимой процедуры, функция @@FETCH_STATUS отражает результаты последней инструкции FETCH, выполненной в хранимой процедуре, а не результаты инструкции FETCH, выполненной прежде, чем была вызвана хранимая процедура.

1. Так теперь что вообще процедуры не писать что ли ? А то вдруг их менять придется
2. И что тут не так ? Где тут проблема то ?
16 ноя 09, 13:29    [7933564]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
iljy
Member

Откуда:
Сообщений: 8711
Werty,

2. так запоминайте значение @@FETCH_STATUS ДО вызова хранимой процедуры.

Что-то у вас курсоров многовато. Обычно это говорит о необходимости серьезного хирургического вмешательства.
16 ноя 09, 13:30    [7933566]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Werty
Glory
Werty

Варианты:
1. Внутри процедуры DeleteFirm встроить 2 UPDATE для Department и User - проблема внесения изменений
2. Вызывать в курсоре процедуру DeleteDepartment, в ней курсором DeleteUser - проблема с @@FETCH_STATUS

1. И какие же там "проблема внесения изменений" ?
2. И что за "проблема с @@FETCH_STATUS" ?


1. Если будут изменения, то придется вносить их не в одну, а в несколько процедур.
2. http://msdn.microsoft.com/ru-ru/library/ms187308.aspx Смутило:

Например, пользователь выполняет инструкцию FETCH из одного курсора, а затем вызывает хранимую процедуру, которая открывает и обрабатывает результаты из другого курсора. Когда управление возвращается от вызванной хранимой процедуры, функция @@FETCH_STATUS отражает результаты последней инструкции FETCH, выполненной в хранимой процедуре, а не результаты инструкции FETCH, выполненной прежде, чем была вызвана хранимая процедура.
Поэтому надо использовать @@FETCH_STATUS сразу после FETCH (а не после вызова какой-то там процедуры).
Так что нет никакой проблемы. А курсор без крайней необходимисти лучше не использовать.
16 ноя 09, 13:30    [7933570]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Werty
1. Если будут изменения, то придется вносить их не в одну, а в несколько процедур.
Напишите комментарий:
"кто внесет изменения сюда, но забудет внести их еще и вон в ту процедуру, тот будет депремирован"
16 ноя 09, 13:31    [7933580]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Werty
Member

Откуда:
Сообщений: 145
Из всех сообщений, я понял, что курсоры использовать не стоит :-)
16 ноя 09, 14:14    [7933978]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Werty
Member

Откуда:
Сообщений: 145
Простите за мою настойчивость, что я ни как не успокоюсь, а вариант с циклами является приемлемым:
CREATE PROCEDURE dbo.UserDelete
(@ID INT)
AS
UPDATE dbo.DF_User
SET IsDeleted = 1
WHERE ID = @ID

GO
CREATE PROCEDURE dbo.DepartmentDelete
(@ID INT)
AS
DECLARE @UserID INT
WHILE EXISTS(SELECT * FROM dbo.DF_User WHERE IsDeleted = 0 AND DepartmentID = @ID)
BEGIN
	SELECT TOP 1 @UserID = ID FROM dbo.DF_User WHERE IsDeleted = 0 AND DepartmentID = @ID
	EXEC dbo.UserDelete @ID = @UserID
END
GO

Вообще кто-нибудь вызывает циклически процедуры? Или лучше написать процедуру UserDeleteByDepartmentID?
17 ноя 09, 10:16    [7937553]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Werty
Member

Откуда:
Сообщений: 145
+ к dbo.DepartmentDelete
UPDATE dbo.Department
SET IsDeleted = 1
WHERE ID = @ID
17 ноя 09, 10:18    [7937565]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Glory
Member

Откуда:
Сообщений: 104760
А зачем тут цикл ?
По join-у удалять что мешает ?
17 ноя 09, 10:18    [7937567]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический апдейт  [new]
Werty
Member

Откуда:
Сообщений: 145
Допустим появляется еще одна сущность заказы: Order, поля ID, Name, UserID, IsDeleted

И при удалении вносить изменения надо будет только в процедуру UserDelete. Или игра не стоит свеч? И как обычно говорят структуру БД надо утвердить, и она не должна изменяться и т.д.
17 ноя 09, 10:29    [7937628]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить