powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / не удается написать триггер
87 сообщений из 87, показаны все 4 страниц
не удается написать триггер
    #39575061
dante0101
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер!
Столкнулся я с одной проблемой, не знаю как решить
Суть задачи такова. При добавлении записи в таблицу процедура,из таблицы расход должны браться количество расходных материалов и отниматься от таблицы расходные материалы
Написанный мною триггер выдает: Вложенный запрос вернул больше одного значения.



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
create database ANALIZ2
go 
use ANALIZ2
 go 
 create table Работник
 (
 ID_РАБОТНИК tinyint identity(1,1) not null primary key,
 Фамилия varchar (50) not null,
 Имя varchar (50) not null,
 Отчество varchar (50) not null,
 Номер_т int  not null CONSTRAINT SUBJ_LIMIT CHECK(Номер_т>=1000000 AND Номер_т<=9999999),
 Должность varchar (50) not null
 )
 create table Пациент
 (
 ID_Пациента tinyint identity(1,1) not null primary key,
 Фамилия varchar (50) not null,
 Имя varchar (50) not null,
 Отчество varchar (50) not null,
 Номер_т int  not null,
 Дата_Рождения date not null
 )
 create table Расходные_материалы 
 (
 ID_Расходных_материалов tinyint identity(1,1) not null primary key,
 Название_материала varchar(50) not null,
 Колличество_оставшегося_материала int  
 )

 create table Услуга
 (
 Id_Услуги tinyint identity(1,1) not null primary key,
 Название_услуги varchar(50) not null
 )

 create table Процедура
 (
 Id_Процедуры tinyint identity(1,1) not null primary key,
Название_процедуры varchar(50) not null,
Кабинет int not null,
Дата_и_время date not null,
Id_Услуги tinyint not null constraint FK_PS foreign key (Id_Услуги) references Услуга( Id_Услуги),
ID_РАБОТНИК tinyint not null constraint FK_PC foreign key ( ID_РАБОТНИК) references Работник ( ID_РАБОТНИК),
ID_Пациента tinyint not null constraint FK_PA foreign key (ID_Пациента) references Пациент (ID_Пациента)
 )

 create table расход
 (
 Id_Расхода tinyint identity(1,1) not null primary key,
 Id_Услуги tinyint not null constraint FK_PZ foreign key (Id_Услуги) references Услуга( Id_Услуги),
 ID_Расходных_материалов tinyint not null constraint FK_PL foreign key (ID_Расходных_материалов) references Расходные_материалы (ID_Расходных_материалов),
 Количество_расходуемого_материала int  
 )
------------------------------------------
 go
 insert into Расходные_материалы(Название_материала,Колличество_оставшегося_материала) values
 ('Ватные палочки',1000),
 ('Перчатки',1000),
 ('Шприцы',1000),
 ('Одноразовые пробирки',1000),
 ('Ватные диски',1000),
 ('Гель для узи',1500),
 ('Дезинфектор',10000),
 ('Иглы',1500),
 ('Бахилы',2500),
 ('Одноразовые полотенца',10000),
 ('Пепетки',1500),
 ('Баночки для мочи',1000),
 ('Баночки для кала',1000),
 ('Реагент на ВИЧ',1000),
 ('Реагент на Гепатит В',1000),
 ('Реагент на ТГК',1000),
 ('Реагент на гепатит С',1000),
 ('Реагент на эритроциты',1000),
 ('Реагент на гомоглобин',1000),
 ('Реагент на тромбоцты',1000),
 ('Реагент на глюкозу',1000)
	
insert into Работник (Фамилия,Имя,Отчество,Номер_т,Должность) values
('Беганская','Анна','Сергеевна',7534521,'Сборщик крови'),
('Головко','Антон','Сергеевич',6584653,'Специалист по УЗИ'),
('Давидян','Артем','Арутинович',9654216,'Сборщик кала'),
('Джумайло','Владислав','Альбертович',4568432,'Сборщик мочи'),
('Дубинин','Олег','Александрович',4984324,'Сборщик гормонов щитовидной железы'),
('Исаев','Роман','Дмитриевич',6854325,'Сборщик гормонов репродуктивной системы'),
('Калиновский','Андрей','Михайлович',4653215,'Сборщик_крови'),
('Камаева','Яна','Владимировна',6531456,'Сборщица_крови')
insert into Пациент(Фамилия,Имя,Отчество,Номер_т,Дата_Рождения)values
('Карамутлу','Даниил','Махмутович',7953267,'05.03.1999'),
('Козлова','Полина','Влаславовна',7525133,'17.04.1998'),
('Коношенков','Константин','Васильевич',7472547,'26.03.1999'),
('Котиков','Максим','Вячеславович',7359164,'17.01.1998'),
('Нестерович','Илья','Сергеевич',7623841,'14.02.1998'),
('Саленко','Екатерина','Дмитриевна',8529614,'21.06.1999'),
('Сущеня','Владислав','Валентинович',6514851,'15.03.1999'),
('Секержитская','Анастасия','Александровна',2589641,'06.07.1999'),
('Телешь','Ян','Александрович',3458521,'30.12.1999'),
('Тихомиров','Борис','Константинович',1532585,'03.08.1999')
insert into Услуга(Название_услуги)values
('Клинический_анализ_крови'),
('Общий_анализ_крови'),
('Биохимический_анализ_крови'),
('Оприделение_группы_крови'),
('Анализ_крови_на_гепатит_В'),
('Анализ_крови_на_гепатит_С'),
('Анализ_крови_на_ВИЧ'),
('Анализ_крови_на_содержание_ТГК'),
('Анализ_гормонов_щитовидной_железы'),
('Анализ_гормонов_репродуктивной_системы'),
('Общий_анализ_мочи'),
('Общий_анализ_кала'),
('УЗИ_сердца'),
('УЗИ_поджелудочной_железы'),
('УЗИ_плода'),
('УЗИ_кишечника')


 insert into Расход( ID_Расходных_материалов,Id_Услуги,Количество_расходуемого_материала ) values
  (1,1,1),(2,1,1),(3,1,1),(4,1,1),(5,1,1), (7,1,1), (8,1,1), (9,1,1), (11,1,1), (18,1,1), (19,1,1), (20,1,1), (21,1,1),  
  (1,2,1), (2,2,1), (3,2,1), (4,2,1), (5,2,1), (7,2,1), (8,2,1), (9,2,1), (11,2,1), (18,2,1), (19,2,1), (20,2,1), (21,2,1),
  (1,3,1), (2,3,1), (3,3,1), (4,3,1), (5,3,1), (7,3,1), (8,3,1), (9,3,1), (11,3,1), (18,3,1), (19,3,1), (20,3,1), (21,3,1),
  (1,4,1), (2,4,1), (3,4,1), (4,4,1), (5,4,1), (7,4,1), (8,4,1), (9,4,1), (11,4,1),   
  (1,5,1), (2,5,1), (3,5,1), (4,5,1), (5,5,1), (7,5,1), (8,5,1), (9,5,1), (11,5,1), (15,5,1),
  (1,6,1), (2,6,1), (3,6,1), (4,6,1), (5,6,1), (7,6,1), (8,6,1), (9,6,1), (11,6,1), (17,6,1),
  (1,7,1), (2,7,1), (3,7,1), (4,7,1), (5,7,1), (7,7,1), (8,7,1), (9,7,1), (11,7,1), (14,7,1),
  (1,8,1), (2,8,1), (3,8,1), (4,8,1), (5,8,1), (7,8,1), (8,8,1), (9,8,1), (11,8,1), (16,8,1),
  (1,9,1), (2,9,1), (3,9,1), (4,9,1), (5,9,1), (7,9,1), (8,9,1), (9,9,1), (11,9,1),
  (1,10,1), (2,10,1), (3,10,1), (4,10,1), (5,10,1), (7,10,1), (8,10,1), (9,10,1), (11,10,1),
  (2,11,1), (4,11,1), (7,11,1), (9,11,1), (12,11,1),
  (2,12,1), (4,12,1), (7,12,1), (9,12,1), (13,12,1),
  (2,13,1), (5,13,1), (6,13,1), (7,13,1), (9,13,1), (11,13,1),
  (2,14,1), (5,14,1), (6,14,1), (7,14,1), (9,14,1), (11,14,1),
  (2,15,1), (5,15,1), (6,15,1), (7,15,1), (9,15,1), (11,15,1),
  (2,16,1), (5,16,1), (6,16,1), (7,16,1), (9,16,1), (11,16,1)
 
 insert into Процедура(Название_процедуры,Кабинет,Дата_и_время,ID_Пациента,ID_РАБОТНИК,Id_Услуги)values
('Клинический_анализ_крови',108,'18-12-2017 08:10',2,1,1)
----------------
go
create trigger Spis_tr
on Процедура after insert
as
 declare @id_usl int
 set @id_usl = (select Id_Услуги from inserted )
 declare @kol int, @raschod int
 set @kol = (select расход.Количество_расходуемого_материала from расход where расход.Id_Услуги = @id_usl)
 set @raschod = (select расход.ID_Расходных_материалов from расход where расход.Id_Услуги = @id_usl)
 update Расходные_материалы
 set Колличество_оставшегося_материала = Колличество_оставшегося_материала - @kol
 where ID_Расходных_материалов = @raschod
 print @id_usl
 print @kol
 print @raschod
 rollback tran
 
 go

 drop trigger Spis_tr



------------------
 go
create trigger Spis_t1
on Процедура after insert
as
 declare @id_usl int
 set @id_usl = (select Id_Услуги from Услуга where  Услуга.Id_Услуги = 1   )
 declare @kol int, @raschod int
 set @kol = (select расход.Количество_расходуемого_материала from расход where расход.Id_Услуги = @id_usl)
 set @raschod = (select расход.ID_Расходных_материалов from расход where расход.Id_Услуги = @id_usl)
 update Расходные_материалы
 set Колличество_оставшегося_материала = Колличество_оставшегося_материала - @kol
 where ID_Расходных_материалов = @raschod
 print @id_usl
 print @kol
 print @raschod
 
 select Id_Услуги from Услуга
 go

 drop trigger Spis_t1
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575097
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dante0101Написанный мною триггер выдает: Вложенный запрос вернул больше одного значения.потому что
Код: sql
1.
set @kol = (select расход.Количество_расходуемого_материала from расход where расход.Id_Услуги = @id_usl)
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575105
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dante0101,

Дедушка прав. Но я бы, с архитектурной точки зрения, предложил бы Вам вообще отказаться от триггера. Во-первых, обновление записей - это источник блокировок. Во-вторых, так как у Вас будут не только расходы процедуры, а так же приходы и корректировки количества, то Вы потом и не поймете, откуда у Вас такое количество вообще взялось.

Поэтому, предлагаю убрать из таблицы Расходные_материалы колонку Колличество_оставшегося_материала. Вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
create table Расходные_материалы 
 (
 ID_Расходных_материалов tinyint identity(1,1) not null primary key,
 Название_материала varchar(50) not null
 )
GO
  insert into Расходные_материалы(Название_материала) values
 ('Ватные палочки'),
 ('Перчатки'),
 ('Шприцы'),
 ('Одноразовые пробирки'),
 ('Ватные диски'),
 ('Гель для узи'),
 ('Дезинфектор'),
 ('Иглы'),
 ('Бахилы'),
 ('Одноразовые полотенца'),
 ('Пепетки'),
 ('Баночки для мочи'),
 ('Баночки для кала'),
 ('Реагент на ВИЧ'),
 ('Реагент на Гепатит В'),
 ('Реагент на ТГК'),
 ('Реагент на гепатит С'),
 ('Реагент на эритроциты'),
 ('Реагент на гомоглобин'),
 ('Реагент на тромбоцты'),
 ('Реагент на глюкозу')



Добавить таблицу Приход_материалов вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 CREATE TABLE Приход_материалов (
  Id_операции int IDENTITY(1,1) PRIMARY KEY,
  ID_Расходных_материалов tinyint not null constraint FK_PL2 foreign key (ID_Расходных_материалов) references Расходные_материалы (ID_Расходных_материалов),
  Количество INT,
  Комментарий nvarchar(30) -- Поступление, корректировка количества и т.п.
)
GO
 INSERT Приход_материалов (ID_Расходных_материалов, Количество, Комментарий) VALUES
 (1,1000,N'Начальное количество'),
 (2,1000,N'Начальное количество'),
 (3,1000,N'Начальное количество'),
 (4,1000,N'Начальное количество'),
 (5,1000,N'Начальное количество'),
 (6,1500,N'Начальное количество'),
 (7,10000,N'Начальное количество'),
 (8,1500,N'Начальное количество'),
 (9,2500,N'Начальное количество'),
 (10,10000,N'Начальное количество'),
 (11,1500,N'Начальное количество'),
 (12,1000,N'Начальное количество'),
 (13,1000,N'Начальное количество'),
 (14,1000,N'Начальное количество'),
 (15,1000,N'Начальное количество'),
 (16,1000,N'Начальное количество'),
 (17,1000,N'Начальное количество'),
 (18,1000,N'Начальное количество'),
 (19,1000,N'Начальное количество'),
 (20,1000,N'Начальное количество'),
 (21,1000,N'Начальное количество')



А для получения актуальных остатков сделать VIEW;
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE VIEW Остаток_расходных_материалов AS
SELECT M.ID_Расходных_материалов, M.Название_материала,
  ISNULL(I.Количество,0)-ISNULL(T.Количество,0) AS Остаток
FROM Расходные_материалы M
LEFT JOIN (SELECT ID_Расходных_материалов, SUM(Количество) AS Количество
  FROM Приход_материалов GROUP BY ID_Расходных_материалов) I ON I.ID_Расходных_материалов=M.ID_Расходных_материалов
LEFT JOIN (SELECT B.ID_Расходных_материалов, SUM(B.Количество_расходуемого_материала) AS Количество
  FROM Процедура P
  JOIN Расход B ON B.Id_Услуги=P.Id_Услуги
  GROUP BY B.ID_Расходных_материалов) T ON T.ID_Расходных_материалов=M.ID_Расходных_материалов
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575326
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dante0101,

Никогда так не делайте:
ptr128А для получения актуальных остатков сделать VIEW;
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE VIEW Остаток_расходных_материалов AS
SELECT M.ID_Расходных_материалов, M.Название_материала,
  ISNULL(I.Количество,0)-ISNULL(T.Количество,0) AS Остаток
FROM Расходные_материалы M
LEFT JOIN (SELECT ID_Расходных_материалов, SUM(Количество) AS Количество
  FROM Приход_материалов GROUP BY ID_Расходных_материалов) I ON I.ID_Расходных_материалов=M.ID_Расходных_материалов
LEFT JOIN (SELECT B.ID_Расходных_материалов, SUM(B.Количество_расходуемого_материала) AS Количество
  FROM Процедура P
  JOIN Расход B ON B.Id_Услуги=P.Id_Услуги
  GROUP BY B.ID_Расходных_материалов) T ON T.ID_Расходных_материалов=M.ID_Расходных_материалов

Помимо того, что запрос будет лопатить все приходы и расходы по затронутым материалам, действительно актуальные остатки можно получить только на TIL serializable.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575331
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmdante0101,
Помимо того, что запрос будет лопатить все приходы и расходы по затронутым материалам, действительно актуальные остатки можно получить только на TIL serializable.
А Вам жалко? Я так понял, что тут за год и 100 тыс. операций не наберется. А раз в год все можно переносить в архив.
А так как актуальные остатки используются только для отчета, то тут я бы, скоре, READ UNCOMMITED использовал )
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575357
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128А Вам жалко?Мне нет. Если ТС предпочтет делать хрень, то его проблемы.
ptr128А так как актуальные остатки используются только для отчетаОпять свой личный опыт экстраполируете на целый мир?
По-вашему того, кто хочет что-то забрать со склада, в принципе не должно интересовать а сколько этого что-то на складе есть?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575373
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в каких вузах учат писать
автор ID _материалов

Это же безумие какое-то? Кто вообще автора учил объекты БД именовать кирилицей?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575398
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileЭто же безумие какое-то? Кто вообще автора учил объекты БД именовать кирилицей?и какой язык является "провославным" для именования объектов БД с вашей точки зрения?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575403
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmПо-вашему того, кто хочет что-то забрать со склада, в принципе не должно интересовать а сколько этого что-то на складе есть?
В постановке задачи ТС это как раз совершенно не интересно. Перечитайте внимательно, что он написал.
А как хотел ТС, так делать вообще не допустимо. Он собирался обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, что гарантированно будет приводить к дидлокам.

Я понимаю Ваше желание продвигать более правильные подходы, с двух шаговой обработкой (резервирование по всем строкам, если успешно - то списание), но они далеко выходят за рамки задачи, поставленной ТС и уж точно не предназначены для реализации в триггере.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575431
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДедушкаCammomileЭто же безумие какое-то? Кто вообще автора учил объекты БД именовать кирилицей?и какой язык является "провославным" для именования объектов БД с вашей точки зрения?
Cammomile, конечно, излишне категоричен. Но, с точки зрения повторного использования кода на других проектах, конечно, лучше ограничиваться латинскими буквами. А то сегодня заказчик из России, а завтра - уже из Бельгии или ОАЭ.
В случае ТС, это уж точно не имеет никакого значения, так что пусть называет объекты БД так, как ему заблагорассудится )
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575464
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileЭто же безумие какое-то? Кто вообще автора учил объекты БД именовать кирилицей?
навеяло...
анекдотКак вы так быстро изучили английский?!
Это было очень просто - он очень похож на SQL!
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575469
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начнем с того, что программист должен все делать рационально и разумно.
Именовать объекты бд кирилицей нерационально хотяб потому, что постоянно надо переключать раскладку, для написания непосредственно языковых инструкций.
Далее, даже если кодер 100% уверен, что его проект никто не будет использовать на международной арене, писать по-русски это просто дурной тон. Так уж исторически сложилось, что программирует весь мир по-английски. (Если не считать всякиз один-эсеров, у которых свое "пограмирование")
Далее, ежели все таки принято судьбоносное решение писать поля да таблицы кирилицей, то будь добр выдерживать стиль.
ID_объекта это такая же криворукая порнография как tsena_one_l_benzina или ItogoProdaz.
Про прочие разезды между аппер кемелом, снейккейсом и аппер снейком я вообще молчу.
Хочется взять и дать тапкой по рукам, за такие коды.


Триггеры у него не пишутся - научись код оформлять сначала, а потом в триггеры лезь!
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575493
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
использовать кириллицу можно, только как потом отличать
Eng?RusEng?RusCСНHОOТTBВEЕ
etc и т.п.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575497
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile,

Не смотря на то, что с истинностью Ваших высказываний я согласен, хочу заметить, что Ваш тон и стиль скорее может отбить у новичка всякое желание изучать SQL, чем донести до него какие-то истины.
Какова цель этого Вашего поста?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575499
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileПро прочие разезды между аппер кемелом, снейккейсом и аппер снейком я вообще молчу.
Camel-case знаю, Snake-case знаю, а вот про эти впервые слышу, что за звери такие?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575515
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичCammomileПро прочие разезды между аппер кемелом, снейккейсом и аппер снейком я вообще молчу.
Camel-case знаю, Snake-case знаю, а вот про эти впервые слышу, что за звери такие?

UpperCamelCase
loverCamelCase
snake_case
UPPER_SNAKE_CASE

Какой_то_Хренокейс
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575526
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileCamelCase
snake_case

и dash-case (он же hypens)?
Итого, имеем как минимум 3 вида "валидных" "общепринятых" способов написания названий. Добавляем к ним некоторые вариации и уже получаем с десяток "общепринятых" способов.

CammomileИменовать объекты бд кирилицей нерационально хотяб потому, что постоянно надо переключать раскладку
Вот это нормальное обоснование. Все остальное - шелуха предрассудков.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575529
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где шелуха? Я же не спорю за КемелКейс против снейк_кейса, я говорю, что стиль должен быть единый.

Какая-такая шелуха предрассудков? Ну давайте тогда,вообще, [Именовать объекты :: как попало], то-то будет вольница и расцвет молоды талантов!
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575530
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile[Именовать объекты :: как попало]
WHY нет? Нормальный такой стиль. Только нужно будет везде брекеты использовать, а 90% их не ставят потому что "код выглядит компактнее". А это переучиваться - не зайдет, короче.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575586
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Он собирался обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, что гарантированно будет приводить к дидлокам.Теперь ТС испугается страшного слова и будет в цикле обновлять каждую строку в отдельной транзакции.
У вас классный хрустальный шар: не видя ни запроса, ни его плана - сразу ставите диагноз.
ptr128и уж точно не предназначены для реализации в триггере.Очередной триггерофоб...
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575589
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmОчередной триггерофоб...
Докажите, что я не прав, и UPDATE
ptr128нескольких записей одной таблицы в произвольном порядке в пределах одной транзакции
из нескольких параллельных запросов не может привести к дидлоку.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575604
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Докажите, что я не правНет уж. Сначала вы доказывайте свою правоту насчет неприменимости триггеров.
ptr128не может привести к дидлокуПокажите место, где я утверждал, что "не может". Заодно поясните каким образом связаны триггер и дедлочащий update.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575724
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЗаодно поясните каким образом связаны триггер и дедлочащий update.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
IF EXISTS (SELECT 1 FROM sysobjects WHERE name=N'TEST_T' and type='U') DROP TABLE TEST_T 
IF EXISTS (SELECT 1 FROM sysobjects WHERE name=N'TEST_L' and type='U') DROP TABLE TEST_L
IF EXISTS (SELECT 1 FROM sysobjects WHERE name=N'TEST_Q' and type='U') DROP TABLE TEST_Q
IF EXISTS (SELECT 1 FROM sysobjects WHERE name=N'TEST_T_TR' and type='TR') DROP TRIGGER TEST_T_TR
GO
CREATE TABLE TEST_T (ID int)
CREATE TABLE TEST_L (ID int PRIMARY KEY NONCLUSTERED, QTY int)
--CREATE TABLE TEST_L (ID int PRIMARY KEY, QTY int)
CREATE TABLE TEST_Q (THREAD int, ID int)
GO
CREATE INDEX THREAD_IDX ON TEST_Q (THREAD)
GO
DECLARE @I int, @V int = 0
SET NOCOUNT ON
BEGIN TRAN
WHILE @V<1000001 BEGIN
  INSERT TEST_L (ID,QTY) VALUES (@V, 0)
  SELECT @V=@V+1
END
SELECT @V=0
WHILE @V<1001 BEGIN
  SELECT @I=0
  WHILE @I<11 BEGIN
    INSERT TEST_Q (THREAD, ID) VALUES (@I,CONVERT(int,RAND()*1000000))
    SELECT @I=@I+1
  END
  SELECT @V=@V+1
END
COMMIT TRAN
SET NOCOUNT OFF
GO
UPDATE STATISTICS TEST_Q WITH FULLSCAN
UPDATE STATISTICS TEST_L WITH FULLSCAN
GO
CREATE TRIGGER TEST_T_TR ON TEST_T AFTER INSERT AS
  UPDATE T
  SET QTY=T.QTY+CONVERT(int,RAND()*100)
  FROM TEST_L T
  JOIN TEST_Q Q ON Q.ID=T.ID AND Q.THREAD=CONVERT(int,RAND()*10)
GO



Двумя потоками запускаем
Код: sql
1.
WHILE 1=1 INSERT TEST_T VALUES (1)



У меня через несколько секунд на одном из потоков выдало:
Код: sql
1.
2.
Msg 1205, Level 13, State 51, Procedure TEST_T_TR, Line 2
Transaction (Process ID 62) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.



А теперь или извиняйтесь за наезд, или доказывайте Вы правы.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575858
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рыбка не понимает, что не триггер приводит к deadlock, что тут поделать
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575866
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Чукча ни читатель, чукча писатель?

ptr128Он собирался обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, что гарантированно будет приводить к дидлокам.
И совершенно не важно в триггере это будет происходить или нет.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575870
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128и уж точно не предназначены для реализации в триггере.Очередной триггерофоб...
Я ничего не имею против триггеров. Но у меня претензии к безграмотным кодерам, не понимающим того, что триггер по определению выполняется внутри транзакции.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575935
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

Забавный вы человек :)

Сначала пишите фигню: 21060269
Когда вам на это указывают, наезжаете в ответ: 21060985
Потом доказываете то, что вас не просили, да еще и то, что в доказательствах не нуждается: 21061621
Затем отделываетесь общими словами там, где нужна конкретика: 21062179

И за все это требуете извинений. Смешно.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575945
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а тема то интересная :)
автор Он собирался обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, что гарантированно будет приводить к дидлокам.

это как же...
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575949
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Забавный Вы тролль :)

Сначала кривляетесь, по сути, утверждая, что никаких дидлоков не будет.
invmptr128Он собирался обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, что гарантированно будет приводить к дидлокам.
Теперь ТС испугается страшного слова и будет в цикле обновлять каждую строку в отдельной транзакции.

Потом занимаетесь демагогией, приплетя вдруг триггеры:
invm Сначала вы доказывайте свою правоту насчет неприменимости триггеров.
Совершенно проигнорировав то, что триггеры употреблялись в совсем другой фразе:
ptr128правильные подходы, с двух шаговой обработкой (резервирование по всем строкам, если успешно - то списание), но они далеко выходят за рамки задачи, поставленной ТС и уж точно не предназначены для реализации в триггере.
Которая говорит только о том,
ptr128что триггер по определению выполняется внутри транзакции.
Следовательно, пытаться разбить одну большую транзакцию на мелкие, в триггере просто бессмысленно.

А когда я доказываю свое утверждение
ptr128Он собирался обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, что гарантированно будет приводить к дидлокам.
,даже с триггером, который Вы зачем-то приплели, Вы просто продолжаете хамить совершенно никак не обосновывая своих слов.

При этом Вы еще не понимаете, как можно извиняться за откровенное хамство
invmТеперь ТС испугается страшного слова...
У вас классный хрустальный шар...
Очередной триггерофоб...
пишите фигню...
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575950
Goga-Gola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CammomileНачнем с того, что программист должен все делать рационально и разумно.
Именовать объекты бд кирилицей нерационально хотяб потому, что постоянно надо переключать раскладку, для написания непосредственно языковых инструкций...

а в 1C функции типа "ЕстьNull" - это неразумные программисты делали? да и названия там все по-русски и нет проблем..
А объемы продаж говорят сами за себя. Или ваш продукт успешнее? :)
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575954
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKа тема то интересная :)
автор Он собирался обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, что гарантированно будет приводить к дидлокам.

это как же...

Чукча не читатель, чукча писатель? 21061621
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575969
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСе это чушь.
Это же обычная складская задача.

Используйте складской подход.

Есть историческая таблица с остатками типа:
(IDTowar, Date, Count, SUM)

и таблица с документами типа
IDDOC
TypeDoc,
DTDOC
DeltaCount,
Price
Sum,
и т.п.

Документы меняют состояние исторической таблицы с остатками - все остальное ерунда.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575976
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffar,

и конечно вся логика будет сосредоточена в триггере на таблицу с документами.
с разбивкой по типам и провести / откатить документ.
логику можно вынести в процедуры а их внести в триггер.

Но лучше приводить исходные параметры документа к универсальному набору, который будет изменять состояние таблицы балансов.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575980
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffar,

триггеры рулят потому что только они гарантируют логическую связь данных.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575988
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKа тема то интересная :)
пропущено...

это как же...

Чукча не читатель, чукча писатель? 21061621
не вникая в суть нагенерированного бреда, вперед

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TRIGGER TEST_T_TR ON TEST_T AFTER INSERT AS

  UPDATE T
  SET QTY=T.QTY+CONVERT(int,RAND()*100)
  FROM TEST_L T (TABLOCK)
  JOIN TEST_Q Q ON Q.ID=T.ID AND Q.THREAD=CONVERT(int,RAND()*10)
GO
...
Рейтинг: 0 / 0
не удается написать триггер
    #39575998
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaffarJaffar,

триггеры рулят потому что только они гарантируют логическую связь данных.
в документации есть такое?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576000
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Совершенно проигнорировав то, что триггеры употреблялись в совсем другой фразе:
ptr128правильные подходы, с двух шаговой обработкой (резервирование по всем строкам, если успешно - то списание), но они далеко выходят за рамки задачи, поставленной ТС и уж точно не предназначены для реализации в триггере.
Которая говорит только о том,
ptr128что триггер по определению выполняется внутри транзакции.Какой забавный вывод :) Может рассекретите цепочку рассуждений, которая к нему приводит?
А утверждение о неприменимости триггеров так и осталось без объяснений...
И кто же тут демагогией занимается?

И это мы еще не обсуждали
ptr128А так как актуальные остатки используются только для отчета, то тут я бы, скоре, READ UNCOMMITED использовал )Даже страшно представить к чему это приведет...


Внимательно перечитывайте собственные сообщения, которые я цитирую, может тогда поймете о чем речь. Заодно найдете в одном из них порожденную вами же связь между триггером и дедлоком.

Впрочем, дискутировать с вами бестолку - ошибок не признаете и слишком заняты самолюбованием...
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576001
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaffarВСе это чушь.
Ну Вы достаточно ёмко и самокритично озаглавили свой пост.
Но я все же разберу его

JaffarЕсть историческая таблица с остатками типа:
(IDTowar, Date, Count, SUM)

и таблица с документами типа
IDDOC
TypeDoc,
DTDOC
DeltaCount,
Price
Sum,
и т.п.

Документы меняют состояние исторической таблицы с остатками - все остальное ерунда.
Во-первых, начнем с того, что есть не таблица с документами, а, как минимум, две таблицы - заголовок документа и его строки.
Во-вторых, просто обновить агрегированные количества одним запросом нельзя, так попытка
ptr128обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, [...] гарантированно будет приводить к дидлокам
Что доказано тут 21061621

ptr128более правильные подходы, с двух шаговой обработкой (резервирование по всем строкам, если успешно - то списание)
подразумевают, следующий механизм.
1. В каждой строке документа у нас есть флаг, который мы выставляем в 1 в случае успешного резервирования. В заголовке документа имеем так же флаг проведения всего документа или, что чаще встречается, факт проведения отражается совсем в другой таблице.
2. В таблице агрегатов имеем не только актуальный остаток, но еще и зарезервированное количество. Доступное количество рассчитывается как их разность.
3. По каждой строке документа отдельной транзакцией выполняется резервирование (увеличение зарезервированного количества) с проверкой того, хватает ли для этого доступного количества. В той же транзакции в строке устанавливается флаг резервирования.
4. Если резервирование всех строк прошло успешно, то есть доступного количества хватило для всех позиций в документе, мы опять, по каждой строке документа отдельной транзакцией выполняем уменьшение актуального количества, зарезервированного количества и сбрасываем флаг резервирования в строке.
5. Если резервирование хотя бы для одной строки не удалось, то мы снова, по каждой строке документа, в которой установлен флаг резервирования, отдельной транзакцией, уменьшаем зарезервированное количество и сбрасываем флаг резервирования.
6. Механизм логической транзакции и средства восстановления после сбоя я тут опускаю, хотя их реализация обязательна.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576011
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goga-Gola а в 1C функции типа "ЕстьNull" - это неразумные программисты делали? да и названия там все по-русски и нет проблем.. А объемы продаж говорят сами за себя. Или ваш продукт успешнее? :)
Рукожопое поделие, удачно зашедшее в нищем пост-совке. У предприятий уже был спрос на автоматизацию бизнеса, но еще не было денег ни на обучение специалистов, ни на западный продукт, ни опыта внедрения.А тут еще и чрезвычайно низкий порог вхождения быдлокодеров был обеспечен как раз тем, что вместо английского, который надо учить и понимать, можно было писать ПосчитатьНакладная(документ, цена) .

А теперь, дружок, марш в гугел с запросом "Best CRM Software 2016" (или 2017) и найди мне там 1С хотя бы в топе 20...
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576020
Goga-Gola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cammomile,

еще один "Мэтр" с уровнем общения младшего школьника...

назови свое творение, я поищу его в списке ТОР 2000000....
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576023
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goga-GolaCammomile,

еще один "Мэтр" с уровнем общения младшего школьника...

назови свое творение, я поищу его в списке ТОР 2000000....
то как портирован 1С на ms SQL это полная жопа, и тут не надо даже доказывать - отгулите десятки тем с производительностью даже на этом форуме. + оптимизация всего этого только через ресурсы систем, в итоге колхоз со 100 комбайнёрами работает на топовых серверах, с комментарием by design
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576026
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128подразумевают, следующий механизм.
1. В каждой строке документа у нас есть флаг, который мы выставляем в 1 в случае успешного резервирования. В заголовке документа имеем так же флаг проведения всего документа или, что чаще встречается, факт проведения отражается совсем в другой таблице.
2. В таблице агрегатов имеем не только актуальный остаток, но еще и зарезервированное количество. Доступное количество рассчитывается как их разность.
3. По каждой строке документа отдельной транзакцией выполняется резервирование (увеличение зарезервированного количества) с проверкой того, хватает ли для этого доступного количества. В той же транзакции в строке устанавливается флаг резервирования.
4. Если резервирование всех строк прошло успешно, то есть доступного количества хватило для всех позиций в документе, мы опять, по каждой строке документа отдельной транзакцией выполняем уменьшение актуального количества, зарезервированного количества и сбрасываем флаг резервирования в строке.
5. Если резервирование хотя бы для одной строки не удалось, то мы снова, по каждой строке документа, в которой установлен флаг резервирования, отдельной транзакцией, уменьшаем зарезервированное количество и сбрасываем флаг резервирования.
6. Механизм логической транзакции и средства восстановления после сбоя я тут опускаю, хотя их реализация обязательна.И все это вместо отлова ошибки 1205 и организации повтора транзакции...
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576031
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmМожет рассекретите цепочку рассуждений, которая к нему приводит?
Задайте конкретный вопрос - получите конкретный ответ. А мне Ваша логика совершенно непонятна и Вы ее нигде еще не озвучили.

invmА утверждение о неприменимости триггеров так и осталось без объяснений...
Ну я думал, что Вы хоть немного в теме. Впрочем это явно выходит за рамки простых задач, как у ТС, потому будем считать для Вас простительным.
1. Обновление нескольких записей одной таблицы в произвольном порядке в пределах одной транзакции гарантировано приводит к дидлоку. Вопрос только в количестве записей, количестве пользователей и во времени, когда это произойдет.
2. Обновлять записи в таблице всегда в одном порядке не позволяет сам синтаксис UPDATE.
3. Блокировать всю таблицу, в которой обновляются записи, не применимо с точки зрения производительности системы.
4. Остается только единственный путь - разбить одну транзакцию на множество мелких, что не возможно сделать внутри триггера, так как любой триггер всегда выполняется уже внутри транзакции.
Вывод: если для избежания дидлоков одну большую транзакцию необходимо разбить на несколько мелких, то в триггере это сделать не возможно.


invmptr128А так как актуальные остатки используются только для отчета , то тут я бы, скоре, READ UNCOMMITED использовал )Даже страшно представить к чему это приведет...
И к чему? К тому что пользователь, построивший отчет в тот момент, когда выполняется постинг увидит, что часть количеств уже списалась, а часть нет? И на что это повлияет? А что было бы, если бы пользователь построил отчет на секунду раньше, еще до начала постинга? Или на секунду позже, после завершения постинга?
У Вас страхи совершенно детские и абстрактные. Вам Ваши способности даже не позволяют их конкретизировать )))

invmЗаодно найдете в одном из них порожденную вами же связь между триггером и дедлоком.
Пожалуйста, не лгите так нагло. Или скриншот сюда.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576039
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goga-GolaCammomile,
еще один "Мэтр" с уровнем общения младшего школьника...
назови свое творение, я поищу его в списке ТОР 2000000....
Ну, мои творения, как правило, это внутренний корпоративный софт топовых РФ (и не только рф) контор.
Я, вроде бы, нигде не указывал, что разрабатываю коммерческие ЦРМ на продажу. Так, что не вижу, поводов тыкать мне тут "покажи свое".
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576046
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmИ все это вместо отлова ошибки 1205 и организации повтора транзакции...
Именно так. Потому что, по умолчанию, на SQL сервере транзакции в дидлоке сидят до 5(!) секунд.
Так как при этом данные транзакции могут блокировать еще ряд других процессов, то такой подход может приводить к зависаниям на эти 5 секунд вообще всей системы. Я даже не знаю области применения такого решения, чтобы заказчик не вытряс душу из техподдержки.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576049
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда...
ptr128Ну я думал, что Вы хоть немного в теме. Впрочем это явно выходит за рамки простых задач, как у ТС, потому будем считать для Вас простительным.Да куда уж мне до вас... На форуме редко появляются такие гуры...
ptr128Обновлять записи в таблице всегда в одном порядке не позволяет сам синтаксис UPDATE.Если вам так приспичило обеспечить порядок обновления - включите голову и подумайте как это можно сделать.
ptr128Остается только единственный путь - разбить одну транзакцию на множество мелкихУволен.
Состав транзакции определяется бизнес-требованиями, а не капризами разработчика. Если требования предписывают необходимость обработки множества строк в одной транзакции, то так и должно быть сделано.
А возникновение при этом дедлока - побочный эффект, обработку которого грамотный роазработчик обязан предусмотреть. Но, похоже, что "грамотный" - это не про вас.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576051
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmА возникновение при этом дедлока - побочный эффект, обработку которого грамотный роазработчик обязан предусмотреть. Но, похоже, что "грамотный" - это не про вас.
Предложите свое "грамотное" решение. Или только флудить в состоянии?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576053
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,
ладно, блокировать мы боимя, индексы создавать можно на твой афигенный аргумент?
CREATE NONCLUSTERED INDEX IxTemp ON TEST_Q (THREAD,ID)

и да все взрослые дба говорят абсолютно одно и то же, дедлоки будут, главное их контролировать и не генерировать специально как вы
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576060
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmСостав транзакции определяется бизнес-требованиями
Давно так не ржал. Еще и коллег повеселил )))
Бизнес-требование, если это, конечно, не заказной тендер, не то что состав транзакции не ограничивает, а даже платформу и программный продукт. Клиенту важен результат, а как его разработчик добился - его интересует исключительно только с той точки зрения, за сколько часов разработчика ему акт выставили.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576062
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128то такой подход может приводить к зависаниям на эти 5 секунд вообще всей системы.Это всего лишь говорит о квалификации разработчиков этой системы.
Попытайтесь осознать, что дедлоки - нормальный продукт жизнедеятельности многопользовательского окружения.
ptr128Пожалуйста, не лгите так нагло. Или скриншот сюда.Нет уж. Ищите сами. Вам будет полезно.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576063
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128invmСостав транзакции определяется бизнес-требованиями
Давно так не ржал. Еще и коллег повеселил )))
Бизнес-требование, если это, конечно, не заказной тендер, не то что состав транзакции не ограничивает, а даже платформу и программный продукт. Клиенту важен результат, а как его разработчик добился - его интересует исключительно только с той точки зрения, за сколько часов разработчика ему акт выставили.
имхо, тут больше бизнес-правила, но вы можете ржать и дальше
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576065
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Давно так не ржал. Еще и коллег повеселил )))Веселитесь дальше.
Еще веселее станет, когда в результате ваших приседаний товар будет списан только с части документа :)
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576069
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Предложите свое "грамотное" решение. Или только флудить в состоянии?Читайте внимательнее - решение было предложено.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576072
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKиндексы создавать можно на твой афигенный аргумент?
CREATE NONCLUSTERED INDEX IxTemp ON TEST_Q (THREAD,ID)

Можно. И в этом случае, вместо произвольного порядка будет строго определенный.
Я же приводил пример именно для произвольного порядка обновления записей, поэтому данный вариант мне не интересен.
Потому что добиться этого можно только в частном случае, да еще и не всегда, а для конкретного плана (планов) запросов. Которые обладают особенностью меняться по мере эксплуатации БД.

TaPaKдедлоки будут
У чайников - да. У профессионалов - нет.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576075
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128Давно так не ржал. Еще и коллег повеселил )))Веселитесь дальше.
Еще веселее станет, когда в результате ваших приседаний товар будет списан только с части документа :)
Опять детские абстрактные страхи? )))
Или Вы читать не умеете?
Как можно списать товар по результатам отчета?
Как может оказаться списана только часть товара при двухшаговом резервировании-списании по одной строке в транзакции?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576076
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128Предложите свое "грамотное" решение. Или только флудить в состоянии?Читайте внимательнее - решение было предложено.
В упор не вижу. От Вас вижу только детские страхи и флуд. Решения - ни одного.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576079
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKиндексы создавать можно на твой афигенный аргумент?
CREATE NONCLUSTERED INDEX IxTemp ON TEST_Q (THREAD,ID)

Можно. И в этом случае, вместо произвольного порядка будет строго определенный.

ан нет, рыбка больна более серьёзно
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576092
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128пропущено...

Можно. И в этом случае, вместо произвольного порядка будет строго определенный.

ан нет, рыбка больна более серьёзно
Детка здесь обсуждается утверждение, что если
ptr128обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, [это] гарантированно будет приводить к дидлокам.

А если Вы хотите обсудить, всегда ли можно обновлять таблицы в строго определенном порядке, то это совсем другой вопрос. Попробуйте, например, это сделать для случая когда:
1. Используются альтернативные товарные единицы и нужно подменять код товарной единицы на код альтернативной, если по указанной количества не достаточно
2. Используется учет по партиям и нужно подбирать партии товара, да еще и с учетом срока годности.
3. Необходимо сразу рассчитывать себестоимость по LIFO/FIFO
4. Необходимо подбирать склады и места хранения для оптимальной логистики.
Ну просто постинг обычного BOM )))
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576101
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,
Да это единственный вариант и другого нет.

предложите другой вариант - коротко и ясно.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576103
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaffarTaPaK,
Да это единственный вариант и другого нет.

предложите другой вариант - коротко и ясно.
это вы про это

автортриггеры рулят потому что только они гарантируют логическую связь данных.
то я вам скажу что триггеры нихрена не гарантируют
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576107
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128JaffarВСе это чушь.
Ну Вы достаточно ёмко и самокритично озаглавили свой пост.
Но я все же разберу его

JaffarЕсть историческая таблица с остатками типа:
(IDTowar, Date, Count, SUM)

и таблица с документами типа
IDDOC
TypeDoc,
DTDOC
DeltaCount,
Price
Sum,
и т.п.

Документы меняют состояние исторической таблицы с остатками - все остальное ерунда.
Во-первых, начнем с того, что есть не таблица с документами, а, как минимум, две таблицы - заголовок документа и его строки.
Во-вторых, просто обновить агрегированные количества одним запросом нельзя, так попытка
ptr128обновлять несколько записей одной таблицы в произвольном порядке в пределах одной транзакции, [...] гарантированно будет приводить к дидлокам
Что доказано тут 21061621

ptr128более правильные подходы, с двух шаговой обработкой (резервирование по всем строкам, если успешно - то списание)
подразумевают, следующий механизм.
1. В каждой строке документа у нас есть флаг, который мы выставляем в 1 в случае успешного резервирования. В заголовке документа имеем так же флаг проведения всего документа или, что чаще встречается, факт проведения отражается совсем в другой таблице.
2. В таблице агрегатов имеем не только актуальный остаток, но еще и зарезервированное количество. Доступное количество рассчитывается как их разность.
3. По каждой строке документа отдельной транзакцией выполняется резервирование (увеличение зарезервированного количества) с проверкой того, хватает ли для этого доступного количества. В той же транзакции в строке устанавливается флаг резервирования.
4. Если резервирование всех строк прошло успешно, то есть доступного количества хватило для всех позиций в документе, мы опять, по каждой строке документа отдельной транзакцией выполняем уменьшение актуального количества, зарезервированного количества и сбрасываем флаг резервирования в строке.
5. Если резервирование хотя бы для одной строки не удалось, то мы снова, по каждой строке документа, в которой установлен флаг резервирования, отдельной транзакцией, уменьшаем зарезервированное количество и сбрасываем флаг резервирования.
6. Механизм логической транзакции и средства восстановления после сбоя я тут опускаю, хотя их реализация обязательна.


кэп, никто из местных в здравом уме не будут отвечать новичку на риторический вопрос километрами самописного текста и с точностью теоремы описывать все ньюансы.
ему дадут направление - для человека которому ЭТО надо - этого будет достаточно, для остальных студентов, которые пишут курсовую даже километры "самописи" не помогут.

Поэтому все что вы тут написали -это хорошо и правильно и с этим я не спорю, даже не читая(уж простите), ибо....

Поэтому обвинять меня в том что я не пишу "километры" - глупо.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576109
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKJaffarTaPaK,
Да это единственный вариант и другого нет.

предложите другой вариант - коротко и ясно.
это вы про это

автортриггеры рулят потому что только они гарантируют логическую связь данных.
то я вам скажу что триггеры нихрена не гарантируют


будете рассказывать про восстановление после сбоев?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576111
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffarкэп, никто из местных в здравом уме не будут отвечать новичку на риторический вопрос километрами самописного текста и с точностью теоремы описывать все ньюансы.
Но почему то эти "местные" с упорством баранов требуют это от меня )))

JaffarПоэтому обвинять меня в том что я не пишу "километры" - глупо.
Приношу извинения, если обидел. Значит был не прав. Обвинять ни в чем не хотел и это действительно глупо.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576115
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Jaffarкэп, никто из местных в здравом уме не будут отвечать новичку на риторический вопрос километрами самописного текста и с точностью теоремы описывать все ньюансы.
Но почему то эти "местные" с упорством баранов требуют это от меня )))

JaffarПоэтому обвинять меня в том что я не пишу "километры" - глупо.
Приношу извинения, если обидел. Значит был не прав. Обвинять ни в чем не хотел и это действительно глупо.

все в порядке .
НО бараны - это не местные - это новички.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576120
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaffarTaPaKпропущено...

это вы про это

пропущено...

то я вам скажу что триггеры нихрена не гарантируют


будете рассказывать про восстановление после сбоев?
зачем?
какую логическую связь данных гарантирует триггер

Код: sql
1.
2.
3.
4.
5.
CREATE TRIGGER reminder1  
ON Sales.Customer  
AFTER INSERT, UPDATE   
AS PRINT 'Сам дурак';  
GO  


или это не триггер?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576123
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffar,

К тому же, КМК, ТС`ы которые пишут свой первый вопросительный пост:
- не пойми как с ошибками и не могут на человеческом языке выразить свою мысль, но при этом пишут километры "буков"
- просто скопировав условие задачи и т.п.(типа у меня что-то не работает в процедуре и далее процедура "over_100500" строк).
недостойны детального ответа.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576133
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Потому что добиться этого можно только в частном случае, да еще и не всегда, а для конкретного плана (планов) запросов. Которые обладают особенностью меняться по мере эксплуатации БД.Ну-ну, не нужно быть столь категоричным, знаток вы наш. Не знание как это сделать не означает невозможность.
ptr128Как можно списать товар по результатам отчета?Не знаю. Это ваши очередные бредни. Об отчетах речь не шла.
ptr128Как может оказаться списана только часть товара при двухшаговом резервировании-списании по одной строке в транзакции?Речь шла о документе, а не о его строке и о вашем способе проводить документ построчно.
ptr128В упор не вижу.Понятно. Тогда необходима консультация офтальмолога.

Не пытайтесь коверкать вопросы и уходить в сторону. Надувать щеки тоже не нужно - не подействует.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576140
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffarнедостойны детального ответа.
Ну все мы когда-то были молодыми и глупыми...
У меня сейчас очень большие проблемы в кадровом вопросе. Субъективно, кажется, что уровень знаний падает год за годом, а ЧСВ растет все быстрее и быстрее. Поэтому, если удастся мне кого-то подучить, может быть и ко мне прийдет тот, кого кто-то подучил?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576142
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKJaffarпропущено...



будете рассказывать про восстановление после сбоев?
зачем?
какую логическую связь данных гарантирует триггер

Код: sql
1.
2.
3.
4.
5.
CREATE TRIGGER reminder1  
ON Sales.Customer  
AFTER INSERT, UPDATE   
AS PRINT 'Сам дурак';  
GO  


или это не триггер?



кэп, как-бы, я думаю, что не стоит объяснять и это само собой разумеется - что бизнес_целостность данных гарантируется не только наличием какого-то триггера но и кодом в нем написанным.
Или вы думали что триггер типа "сам дурак" - это то что я советовал?

Суть то в том что триггер позволяет вызвать ваш_код каждый раз когда происходит изменение данных в одном месте и на осн. этих изменений изменить другие бизнес_логически связанные данные или отвергнуть изменение.

т.к. при изменении табл. документов - изменить баланс.(если это возможно не закрыт день и т.п.)

И конечно же кэп речь идет о штатном измении т.е. insert, update, delete.



Конечно можно логику навешать на интерфейс и типа все делать в процедурах, но в этом случае нет защиты от просто
insert, update, delete.
Можно конечно и это предусмотреть рулением правами и т.п.
типа дать доступ только к процедурам и view и никаких таблиц - вы за это ратуете?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576146
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Jaffarнедостойны детального ответа.
Ну все мы когда-то были молодыми и глупыми...
У меня сейчас очень большие проблемы в кадровом вопросе. Субъективно, кажется, что уровень знаний падает год за годом, а ЧСВ растет все быстрее и быстрее. Поэтому, если удастся мне кого-то подучить, может быть и ко мне прийдет тот, кого кто-то подучил?


Наверное правильно помочь человеку, который сам постарался и у него не получилось.
Но помогать человеку, который сам не потрудился даже сформулировать вопрос нормально и сам ничего не поискал - тут же есть раздел типа "платная помощь/работа".

На форуме врядли кто-то кого-то научит - ЧСВ как правило растет по exp, а большенство из тех кто действительно неплохо знают
отвечают односложно или вообще изредко "снисходят" до "всяких".


==> уровень знаний падает год за годом
еще в 2002 нам преподы говорили что студенты тупеют год от года, а уж теперь.
В бой идут одни старики.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576148
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffar,

суть в формулировке
автор что только они гарантируют логическую связь данных
сами триггеры ничего не гарантируют, гаратируют описанную бизнес-логику которая реализуются хоть констрейнами, хоть триггерами, хоть хранимками, до хоть молитвами :)
а в борьбе триггеры vs хранимке в другой ветке и я за здравые триггеры :)
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576151
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaffarМожно конечно и это предусмотреть рулением правами и т.п.
типа дать доступ только к процедурам и view и никаких таблиц - вы за это ратуете?

Вообще на мой взгляд именно этот подход и должен рассматриваться в первую очередь.
Выставлять на показ таблицы с их потрохами не есть best practice.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576155
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128Потому что добиться этого [строго определенного порядка] можно только в частном случае, да еще и не всегда, а для конкретного плана (планов) запросов. Которые обладают особенностью меняться по мере эксплуатации БД.Ну-ну, не нужно быть столь категоричным, знаток вы наш. Не знание как это сделать не означает невозможность.
Вперед, расскажите, как можно добиться строго определнной сортировки при UPDATE в общем случае

Или давйте хотя бы пример: 21063123
А не можете, так не мешайте общаться.

invmтовар будет списан только с части документа
ptr128Как можно списать товар по результатам отчета?
Как может оказаться списана только часть товара при двухшаговом резервировании-списании по одной строке в транзакции?Не знаю. Это ваши очередные бредни.
К сожалению, в Ваших бреднях очень сложно разобраться. Поэтому было задано сразу два вопроса. Так как непонятно было к чему относился вопрос: к получению данных агрегированным запросом для отчета или к транзакционной двухшаговой схеме.

invmРечь шла о документе, а не о его строке и о вашем способе проводить документ построчно.
Подробно алгоритм описан тут: 21062720
Ваши претензии?

Да, кстати:
invmНе пытайтесь коверкать вопросы и уходить в сторону. Надувать щеки тоже не нужно - не подействует.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576158
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

автордобиться строго определнной сортировки при UPDATE в общем случае
это через гугл-переводчик прогнали?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576163
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я за вами не успеваю, какая-такая очередность выполнения апдейта? Апдейт это инструкция для сервера, она не должна гарантировать никакой очередности.
Очередность гарантирует только код скуля, описывающий бизнес логику. Или код клиента.

Причем тут апдейты?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576166
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileАпдейт это инструкция для сервера, она не должна гарантировать никакой очередности.
Это именно то, что и я утверждаю.

CammomileПричем тут апдейты?
Обсуждается мое утверждение:
ptr128Обновление нескольких записей одной таблицы в произвольном порядке в пределах одной транзакции гарантировано приводит к дидлоку. Вопрос только в количестве записей, количестве пользователей и во времени, когда это произойдет.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576172
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128CammomileАпдейт это инструкция для сервера, она не должна гарантировать никакой очередности.
Это именно то, что и я утверждаю.

CammomileПричем тут апдейты?
Обсуждается мое утверждение:
ptr128Обновление нескольких записей одной таблицы в произвольном порядке в пределах одной транзакции гарантировано приводит к дидлоку. Вопрос только в количестве записей, количестве пользователей и во времени, когда это произойдет.
так индекс же ответ на ваш идиотский вопрос

и чиво он "дидлок" то?


Модератор: TaPaK блокируется на 3 дня за окорбление. Остыть
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576175
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, о логической связности...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE TRIGGER ...1 ON ... AFTER UPDATE
AS
BEGIN
  INSERT
  INTO
     dummy
  SELECT 
     ...
  FROM
    inserted
  ;
END
GO
CREATE TRIGGER ...2 ON ... AFTER UPDATE
AS
BEGIN
  DELETE
     dd
  FROM
     inserted ii
     INNER JOIN dummy dd ON (...)
  ;
END
GO
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576184
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович,

и?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576232
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Вперед, расскажите, как можно добиться строго определнной сортировки при UPDATE в общем случае Специально для неумеющих думать и считающих, что знают они больше всех:
Код: sql
1.
2.
3.
4.
5.
update t
 set ...
from
 (select top (cast(0x7fffffff as int)) TargetKey, SourceData, ... from Source where ... order by TargetKey) s inner loop/merge/hash join
 Target t on t.KeyField = s.KeyField


ptr128Или давйте хотя бы пример: 21063123 Можете еще ...дцать пунктов туда добавить - в итоге все равно нужна сортировка по ключу целевой таблицы.
И, к сведению, чтобы, если уж очень приспичило воевать с потенциальными дедлоками, сериализовать выполнение какой-нибудь инструкции в многопользовательском окружении, совершенно не обязательно блокировать таблицу или переходить на serializable. И (о Боже!) это можно делать и в триггере и даже не придется сериализовать весь триггер.
ptr128А не можете, так не мешайте общаться.С каких пор у вас появилось право указывать мне что делать?
ptr128К сожалению, в Ваших бреднях очень сложно разобраться.Взаимно.
ptr128Подробно алгоритм описан тут: 21062720
Ваши претензии?У меня претензий нет. Претензии будут у ваших заказчиков.
А вам и вашим смеющимся коллегам было бы неплохо освежить в памяти для чего нужны транзакции.
Ну и заодно оценить какую дополнительную нагрузку дают ваши построчные транзакции. Затем оценить вероятность дедлоков и величину ущерба производительности от них.

И я даже не буду начинать беседу про работу этого алгоритма на стороне сервера, особенно в случае, когда таки придется проводить несколько документов в одной транзакции. Или просто провести документ во внешней транзакции.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576237
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДедушкаCammomileЭто же безумие какое-то? Кто вообще автора учил объекты БД именовать кирилицей?и какой язык является "провославным" для именования объектов БД с вашей точки зрения?

Жёстко-скреповый:

set Ко лл ичество_оставшегося_материала = Ко лл ичество_оставшегося_материала - @kol
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576247
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДедушкаCammomileЭто же безумие какое-то? Кто вообще автора учил объекты БД именовать кирилицей?и какой язык является "провославным" для именования объектов БД с вашей точки зрения?


TotalAmount, base_price: хорошо.
cena_po_dogovoru, Naimenovanie: плоховато.
ИдДокумента: дно.
ID_Клиента: ниже дна.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576272
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128Вперед, расскажите, как можно добиться строго определнной сортировки при UPDATE в общем случае Специально для неумеющих думать и считающих, что знают они больше всех:
И с чего это Вы решили, что это общий случай?
Потому "что не умеете думать и считаете, что знаете больше всех"? )))
Если бы Вы, хотя бы, удосужились прочить 21063123 , где приведен очень упрощенный пример постинга BOM, без вложенных BOM, без трудозатрат, без резервирования оборудования и участков - просто тупой голый BOM(!) - то уже про общий случай ну провозглашали )))

invmptr128Подробно алгоритм описан тут: 21062720
Ваши претензии?У меня претензий нет. Претензии будут у ваших заказчиков.
Клиент слился, заглянул в свой "хрустальный шар" и стал ванговать )))
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576299
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128И с чего это Вы решили, что это общий случай?Потому что это общий случай как обеспечить определенный порядок обновления. А все ваши ВОМы и т.п. - частный.
И если вы не в состоянии привести общий к своему частному, то это сугубо ваши проблемы.
ptr128Клиент слился, заглянул в свой "хрустальный шар" и стал ванговать )))Детский сад...
Правда здорово вырывать фразы из контекста и игнорировать неудобные вопросы?
Ведь таким образом можно скрыть собственные пробелы в знаниях матчасти и не придется признавать свое решение бредовым...
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576326
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128И с чего это Вы решили, что это общий случай?Потому что это общий случай
Вам самому не смешно? Перечитайте Ваш аргумент )))


invmptr128Подробно алгоритм описан тут: 21062720
Ваши претензии?
У меня претензий нет.

И что это, как не "детский сад" и "игнорирование неудобных вопросов"?
Вы "таким образом скрываете собственные пробелы в знаниях матчасти", чтобы не "пришлось признавать свое решение бредовым"?
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576345
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Вам самому не смешно?Уже да. Вы весьма забавны.

На все ваши вопросы ответы были даны. В том числе на основной - как задать порядок обновления.
Если не в состоянии их осмыслить, то это сугубо ваша проблема.
На мои (и не только мои) вопросы вразумительных ответов не было. Только стеб и надувание щек.

Та что более не вижу смысла тратить на вас время.
...
Рейтинг: 0 / 0
не удается написать триггер
    #39576374
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm[
Код: sql
1.
2.
3.
4.
5.
update t
 set ...
from
 (select top (cast(0x7fffffff as int)) TargetKey, SourceData, ... from Source where ... order by TargetKey) s inner loop/merge/hash join
 Target t on t.KeyField = s.KeyField



На всякий случай, для тех будет потом перечитывать этот топик.
Автор совершенно забыл о трех вещах. Его решение может быть работоспособно:
1. только если таблица Target отсутствует в подзапросе (поэтому я и просил его посмотреть на постинг BOM - deadlock будет не X-X/U, а S-X/U)
2. только если max degree of parallelism = 1 (параллельное выполнение запроса нарушит сортировку)
3. только если результат подзапроса полностью помещается в оперативной памяти (если хотя бы одна страница уйдет на диск, то ее сервер достанет последней, что нарушит сортировку)
...
Рейтинг: 0 / 0
87 сообщений из 87, показаны все 4 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / не удается написать триггер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]