Имя: Пароль:
1C
1С v8
триггер в ms sql сделать отказ
,
0 DES
 
23.09.18
23:51
как в триггере, который на инсерт, запретить делать инсерт текущей записи и как передать в триггер параметром поле текущей (создаваемой) записи?
1 youalex
 
24.09.18
04:05
что есть текущая запись?
а так -есть таблица inserted

для отмены:
ROLLBACK TRAN
RAISERROR
2 scanduta
 
24.09.18
09:12
а что мешает использовать триггер instead of insert
3 rs_trade
 
24.09.18
09:14
(0) напомню что триггер срабатывает не для записи, а для команды.
4 DES
 
24.09.18
09:32
(3) как понять для команды?
для каждого случая добавления, перед коммитом, вызывается триггер. Т.е. для каждой записи при ее добавлении!?
5 Cool_Profi
 
24.09.18
09:34
(4) Нет. Если вставляется пачка данных, то вызывается триггер один раз. На всю пачку.
6 DES
 
24.09.18
09:42
(5) т.е. на 1 транзакцию ?
7 Cool_Profi
 
24.09.18
09:47
(6) На один оператор insert.
8 scanduta
 
24.09.18
09:53
(0) автор ты еще поясни что ты имеешь ввиду под:
"запретить делать инсерт текущей записи"
9 DES
 
24.09.18
10:04
(7) а как еще делать отладку триггера, он в момент отладки не дает установить в нем точку останова, а выполняется как одна команда.
10 DES
 
24.09.18
10:05
(8) делаю инсерт, нужно проверить можно ли его делать.
т.е. если нельзя - то отказ в добавлении этой новой записи.
11 Cool_Profi
 
24.09.18
10:05
(9) Отладочную печать изобрели ещё 50 лет назад...
12 Cool_Profi
 
24.09.18
10:06
(10) Перенос бизнес-логики на сервер хранения данных считается моветоном уже лет 20
13 DES
 
24.09.18
10:11
(12) а триггеры забыли исключить.
14 Cool_Profi
 
24.09.18
10:12
(13) Триггеры кошерно использовать для поддержания целостности ссылок.
15 Ёпрст
 
24.09.18
10:12
(10)

ну и воткни там if <условие> where insert table values('Вася','Лошпед')
16 scanduta
 
24.09.18
10:38
(10) Вариантов много,

1)можно использовать CHECK constraint  для таблицы

вот пример

CREATE TABLE [book_history] (
    id int NOT NULL IDENTITY PRIMARY KEY,
    user_id int NOT NULL,
    library_id int NOT NULL,
    book_id int NOT NULL,
    borrow_time datetime DEFAULT GETDATE(),
    return_policy datetime DEFAULT DATEADD(DAY, 30, GETDATE()),
    return_time datetime,
    CHECK (dbo.fn_check_duplicate(user_id, library_id, book_id) = 1)
);

Функция проверки:


DROP FUNCTION IF EXISTS fn_check_duplicate
GO
CREATE FUNCTION fn_check_duplicate (@user_id int, @library_id int, @book_id int)
RETURNS int
BEGIN
    RETURN (SELECT COUNT(*) FROM [book_history] WHERE user_id = @user_id AND library_id = @library_id AND book_id = @book_id AND return_time IS NULL)
END
GO


2)Можнo использовать триггер instead of insert

3)Можно unique key сделать.
17 DES
 
24.09.18
19:15
А почему в конструкторе запросов "Выполнить" неактивно?
http://prntscr.com/ky5r4d
Вроде раньше можно было тестить сразу запрос, а теперь не дается.
18 youalex
 
24.09.18
19:48
(17)  соединение не протухло?
19 Fram
 
24.09.18
20:07
(17) а где там запрос?
20 DES
 
24.09.18
20:26
(18) нет сразу неактивно
(19) запрос есть, (и даже если синтаксис запроса из конструктора правильный - все равно  панель не активна)
21 DES
 
25.09.18
16:09
подскажите
как сделать ограничение на таблице с целью уникальности всей записи
например 3 поля
pole_id
pole_1
pole_2

pole_id -это первичный ключ
ка сделать чтобы невозможно было внести записи типа
1 1 1
2 2 2
3 2 2 - эту нельзя пропускать при инсерте или апдейте, так как повторяются поля pole_1 и pole_2
22 DES
 
25.09.18
17:53
А как можно сохранять запросы к базе с параметрами.
Типа представлений но с параметрами
23 youalex
 
25.09.18
19:47
(22) хранимка что ли?