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

Откуда:
Сообщений: 21
Добрый день!
Необходимо реализовать блокировку строки по чекбоксу. Есть таблица №1, в ней есть поля ID и check_box (bit); есть таблица №2, в которой есть поле ID + другие данные. №1 - № 2 = один ко многим. Когда в поле check_box проставляется 1, в таблице №2 блокируются для изменения все поля с таким ID и остаются заблокированными пока в поле check_box не будет установлен 0. Если кто-то знает подскажите, пожалуйста, как можно это реализовать. И что почитать на данную тему. Спасибо.
4 авг 17, 19:43    [20701968]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка строки по чекбоксу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
Достаточно написать триггер, который будет скипать изменения в таблице №2 пока в таблице таблице №1 выставлены чекбоксы.
4 авг 17, 19:46    [20701970]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка строки по чекбоксу  [new]
Владислав Колосов
Member

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

неверная архитектура. Строки не должны зависеть от состояния артибутов других строк, тем более, возможность их изменения. Планируйте свои приложения в учетом оптимистичных блокировок.
6 авг 17, 10:25    [20703327]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка строки по чекбоксу  [new]
Liliia
Member

Откуда:
Сообщений: 21
Гавриленко Сергей Алексеевич,

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER block
   ON  table2
   AFTER UPDATE
AS 
BEGIN
	
	SET NOCOUNT ON;

	if (select check_box from table1 where table1.ID = (select i.ID from inserted i)) = 1
	rollback
	print 'Нет возможности изменить документ'
END
GO


Правильно ли я поняла? Так нужно было сделать?
6 авг 17, 21:34    [20703943]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка строки по чекбоксу  [new]
наутилус
Member

Откуда: UA
Сообщений: 1263
Liliia,

лучше ДО апдейта
6 авг 17, 21:42    [20703951]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка строки по чекбоксу  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
Liliia
Гавриленко Сергей Алексеевич,

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER block
   ON  table2
   AFTER UPDATE
AS 
BEGIN
	
	SET NOCOUNT ON;

	if (select check_box from table1 where table1.ID = (select i.ID from inserted i)) = 1
	rollback
	print 'Нет возможности изменить документ'
END
GO


Правильно ли я поняла? Так нужно было сделать?
Примерно так. Только учтите, что триггер сработает один раз при изменении нескольких записей. При этом в inserted будет несколько записей. Это будет одна транзакция. То есть, надо проверять, если хоть в одной изменяемой записи будет установленный check box, то откатывать всё. Что-то вроде:

IF EXISTS
(
    SELECT *
    FROM
        table1 t
        JOIN inserted i ON i.ID = t.ID
    WHERE t.check_box = 1
)
....
7 авг 17, 10:26    [20704530]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка строки по чекбоксу  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
наутилус
Liliia,

лучше ДО апдейта
Нет таких.
7 авг 17, 10:27    [20704535]     Ответить | Цитировать Сообщить модератору
 Re: Блокировка строки по чекбоксу  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3462
Liliia
Гавриленко Сергей Алексеевич,

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER block
   ON  table2
   AFTER UPDATE
AS 
BEGIN
	
	SET NOCOUNT ON;

	if (select check_box from table1 where table1.ID = (select i.ID from inserted i)) = 1
	rollback
	print 'Нет возможности изменить документ'
END
GO


Правильно ли я поняла? Так нужно было сделать?


Как уже было написано - триггер срабатывает на множестве записей, ну, и , принт там - ни в пень
7 авг 17, 13:14    [20705169]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить