|
|
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Есть две таблицы : nach_abon(суммы) и d_itog(итоги по суммам), необходимо на основе первой формировать суммы во второй таблице.. Написал триггер, использующий курсор, можно ли это решить как то по другому ? Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 07:46:21 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Мне кажется в таблице inserted всегда 1 запись. Поэтому курсором можно не пользоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 08:38:56 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Denis@nk в том то и дело что нет.. запрос на заливку, например.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 08:42:05 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Не понял только как в этом запросе insert into d_itog (Id_klient, sum_itog) select @id, -@sum, 1 вы добавляете 3 поля ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 10:32:24 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Glory огромное спасибо за помощь начинающему :) А насчет добавления, просто опечатался, применил предложеный тобой подход и все прекрасно, единственно думаю добавить проверку на кол-во записейи ввести переменные, чтобы не просматривать все записи при одиночных вставках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 15:13:17 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
думаю добавить проверку на кол-во записейи ввести переменные, чтобы не просматривать все записи при одиночных вставках Это вы про какие такие "просмотры всех записей" ведете речь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2002, 15:45:38 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Glory в смысле if @@rowcount>1 тогда заливать, а так по одиночке :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 05:37:14 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
CREATE TABLE NACH_ABON ( id1 bigint Identity(0,1) PRIMARY KEY, id_klient bigint, sum_nach_abon money ) GO CREATE TABLE d_itog ( Id_klient bigint PRIMARY KEY, sum_itog money ) GO CREATE TRIGGER NACH_ABON_INSERT ON dbo.NACH_ABON for insert AS Declare @ErrStr varchar(255) SET NOCOUNT ON UPDATE U SET sum_itog = U.sum_itog + (SELECT Sum(X.sum_nach_abon) FROM INSERTED AS X WHERE X.id_klient=U.id_klient) FROM INSERTED AS I INNER JOIN d_itog AS U ON U.id_klient=I.id_klient IF @@ERROR <> 0 BEGIN SET @ErrStr = 'Ошибка! Перерасчета итоговых сумм!' GOTO Err_NACH_ABON_INSERT_Ins END INSERT d_itog(Id_klient,sum_itog) SELECT id_klient, Sum(I.sum_nach_abon) FROM INSERTED AS I WHERE 0=(Select count(X.id_klient) From d_itog AS X WHERE X.id_klient=I.id_klient) GROUP BY id_klient IF @@ERROR <> 0 BEGIN SET @ErrStr = 'Ошибка! Расчета итоговой суммы!' GOTO Err_NACH_ABON_INSERT_Ins END SET NOCOUNT OFF return Err_NACH_ABON_INSERT_Ins: ROLLBACK TRANSACTION RAISERROR (@ErrStr,16,-1) GO SELECT id_klient,sum_nach_abon INTO #Temp FROM NACH_ABON WHERE 0=1 INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(1,50) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(1,20) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(1,40) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(2,30) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(2,0) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(5,10) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(1000,100) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(1000,-50) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(1000,400) INSERT INTO #Temp(id_klient,sum_nach_abon) VALUES(1000,200) INSERT INTO NACH_ABON(id_klient,sum_nach_abon) SELECT id_klient,sum_nach_abon FROM #Temp DROP TABLE #Temp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 09:02:46 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Flint-San выражаю горячую благодарность !!! Добавил еще один параметр выборки кроме id выполнено 250000 записей за 30 сек без ошибки ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:01:00 |
|
||
|
Есть-ли альтернатива ЭТОТМУ триггеру ?
|
|||
|---|---|---|---|
|
#18+
Вот подумалось, а почему trigger только на Insert? В задаче наверняка требуются делать все операции. Поэтому предагаю заменить предыдущий trigger следующим: CREATE TRIGGER NACH_ABON_INSUPDDEL ON dbo.NACH_ABON for insert,update,delete AS Declare @ErrStr varchar(255) SET NOCOUNT ON DELETE FROM X FROM d_itog AS X INNER JOIN DELETED AS D ON X.id_klient=D.id_klient WHERE 0=(SELECT count(I.id_klient) FROM INSERTED AS I WHERE I.id_klient=D.id_klient) AND 0=(SELECT count(A.id_klient) FROM NACH_ABON AS A WHERE A.id_klient=D.id_klient) IF @@ERROR <> 0 BEGIN SET @ErrStr = 'Ошибка! Удаления иговых сумм для несуществующих клиентов!' GOTO Err_NACH_ABON_INSUPDDEL END UPDATE U SET sum_itog = U.sum_itog - (SELECT Sum(X.sum_nach_abon) FROM DELETED AS X WHERE X.id_klient=U.id_klient) FROM DELETED AS D INNER JOIN d_itog AS U ON U.id_klient=D.id_klient IF @@ERROR <> 0 BEGIN SET @ErrStr = 'Ошибка! Перерасчета итоговых сумм1!' GOTO Err_NACH_ABON_INSUPDDEL END UPDATE U SET sum_itog = U.sum_itog + (SELECT Sum(X.sum_nach_abon) FROM INSERTED AS X WHERE X.id_klient=U.id_klient) FROM INSERTED AS I INNER JOIN d_itog AS U ON U.id_klient=I.id_klient IF @@ERROR <> 0 BEGIN SET @ErrStr = 'Ошибка! Перерасчета итоговых сумм2!' GOTO Err_NACH_ABON_INSUPDDEL END INSERT d_itog(Id_klient,sum_itog) SELECT id_klient, Sum(I.sum_nach_abon) FROM INSERTED AS I WHERE 0=(Select count(X.id_klient) From d_itog AS X WHERE X.id_klient=I.id_klient) GROUP BY id_klient IF @@ERROR <> 0 BEGIN SET @ErrStr = 'Ошибка! Расчета итоговой суммы!' GOTO Err_NACH_ABON_INSUPDDEL END SET NOCOUNT OFF return Err_NACH_ABON_INSUPDDEL: ROLLBACK TRANSACTION RAISERROR (@ErrStr,16,-1) GO select * from NACH_ABON select * from d_itog UPDATE NACH_ABON SET id_klient=5 WHERE id_klient=1 select * from NACH_ABON select * from d_itog DELETE FROM NACH_ABON where id_klient=2 or id_klient=1000 select * from NACH_ABON select * from d_itog ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2002, 10:16:11 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3375&tid=1818749]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
19ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 189ms |
| total: | 264ms |

| 0 / 0 |
