|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
Привожу пример журналирования триггером. На форуме такие есть, но не все- подходящие. Для получения универсальности изменённые данные разложил не по полям, а поместил в xml. Оказалось, что получить правильный xml, который хранит только изменения- непросто. Сложность в том, что в xml отсутствие атрибута/элемента можно расценивать как null. Если это изменение с null на не null, то сохраняя предыдущее значение поля это можно показать так: Код: xml 1. 2. 3. 4. 5.
Сложность заключается в том, что триггер заранее не знает об изменении поля f2 и это проверяется в процессе выполнения. Но запрос с for xml explicit захардкоден и директива elementxsinil не подходит. Решение в том, чтобы вручную решать для значения, будет ли оно заполненным элементом или "пустым", но с атрибутом xsi:nil="true". Формально, название полей разное и explicit xml генератор это пропускает. Возможно, это хак и его могут прикрыть. Пример писался под sql генератор, но руки не дошли доделать. Концепция не применялась на производственных серверах и сделана только для демонстрации подхода. Используется MSSQL 2008 R2. Код: 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. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245.
для теста Код: 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.
Прошу предложить другие варианты получения null в xml. PS подобный метод уже есть . Нашёл его уже после написания своего. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2017, 22:04 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
tunknown, имхо так было бы немного красивее, но это таки опять не оптимальное решение для любой таблицы не накрутишь - надо писать динамику учета PK code Код: 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.
вообще система отслеживания изменений не требует изобретений велосипедов, есть вполне неплохая CT а если нужна историчность то CDC P.s ну и на последок: ловить в триггере @@PROCID это как воду из кувшина в реку лить ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2017, 02:51 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
felix_ffвообще система отслеживания изменений не требует изобретений велосипедов, есть вполне неплохая CT а если нужна историчность то CDCНекоторые используют 2005 express, в нём не все расширения есть. felix_ffP.s ну и на последок: ловить в триггере @@PROCID это как воду из кувшина в реку литьСудя по документации @@PROCID работает в триггере. А что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2017, 17:55 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
tunknown, @@PROCID несомненно работает, но будет возвращать ID триггера который вызвал вставку в таблицу. Не особо полезная информация в плане понимания какой бизнес послужил инициатором вызова триггера. это может быть как и Ad-Hoc запрос так и хранимка. Хотя если вы хотели отлавливать именно сами триггера - ну это совсем другое дело :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2017, 21:27 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
felix_ffХотя если вы хотели отлавливать именно сами триггера - ну это совсем другое дело :)Я хотел получить название таблицы, но этого сделать нельзя без добавления динамики и перекомпиляции, т.к. предполагается, что таблица может быть использована из разных баз. felix_ff Код: sql 1.
Предполагаю, что такой вариант не сработает из-за попытки приведения к единому типу, т.е. datetime. Или придётся писать собственный конвертер всех типов в строковые значения xml. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2017, 12:21 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
tunknown, авторв историю не попадают update ... set f2=f2, т.к. это не аудит путаете способ хранения и отображения, т.е. структуру и представление. Отсюда возникла потребность в сложном преобразовании при сохранении. Создали проблему, с которой сами же и боретесь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.04.2017, 11:06 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
Ранее я упоминал генератор "универсального" триггера логгирования. Теперь привожу его код. Требуется sql 2005+, других зависимостей не предполагается. Процедура генератора может быть создана и в master. Поддерживаются таблицы в любой базе локального сервера, на которую есть права доступа на создание триггера. Логгирование только частичное, т.к. не поддерживаются BLOB поля и откат транзакции влияет на результат. Побочный эффект- переназначает на себя first/last trigger. Если для таблицы лога создать отдельную базу на быстром диске, то сильного падения производительности не наблюдается. Проверен на таблицах с 200+ полями. Код: 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. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577. 578. 579. 580. 581. 582. 583. 584. 585. 586. 587. 588. 589. 590. 591. 592. 593. 594. 595. 596. 597. 598. 599. 600. 601. 602. 603. 604. 605. 606. 607. 608. 609. 610. 611. 612. 613. 614. 615. 616. 617. 618. 619. 620. 621. 622. 623. 624. 625. 626. 627. 628. 629. 630. 631. 632. 633. 634. 635. 636. 637. 638. 639. 640. 641. 642. 643. 644. 645. 646. 647. 648. 649. 650. 651. 652. 653. 654. 655. 656. 657. 658. 659. 660. 661. 662. 663. 664. 665. 666. 667. 668. 669. 670. 671. 672. 673. 674. 675. 676. 677. 678. 679. 680. 681. 682. 683. 684. 685. 686. 687. 688. 689. 690. 691. 692. 693. 694. 695. 696. 697. 698. 699. 700. 701. 702. 703. 704. 705. 706. 707. 708. 709. 710. 711. 712. 713. 714. 715. 716. 717. 718. 719. 720. 721. 722. 723. 724. 725. 726. 727. 728. 729. 730. 731. 732. 733. 734. 735. 736. 737. 738. 739. 740. 741. 742. 743. 744. 745. 746. 747. 748. 749. 750. 751. 752. 753. 754. 755. 756. 757. 758. 759. 760.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 23:06 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
tunknown, Если честно, то на первый взгляд это полная жесть, которую можно и нужно упрощать до вменяемого вида. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 00:51 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
invm Если честно, то на первый взгляд это полная жесть, которую можно и нужно упрощать до вменяемого вида. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 17:05 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
tunknown invm Если честно, то на первый взгляд это полная жесть, которую можно и нужно упрощать до вменяемого вида. Код: sql 1. 2.
А ваш универсальный триггер крут, как все "универсальные процедуры", но непригоден для использования в продакшене. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 18:04 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
Оптимальный аудит таблиц можно сделать при помощи CDC. Темпоральные таблицы - тоже хорошая штука, но имеют свои особенности. Триггеры приемлемы в малонагруженных таблицах, но там городить "унивесальный" код нет смысла. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 18:19 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
Владислав Колосов Триггеры приемлемы в малонагруженных таблицах Довольно спорное утверждение ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 20:52 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
Владислав Колосов Оптимальный аудит таблиц можно сделать при помощи CDC. Владислав Колосов Триггеры приемлемы в малонагруженных таблицах, ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2019, 21:18 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
alexeyvg, проблема пользователя и прочих данных аудита решается при помощи вспомогательной таблицы. Под высокой нагрузкой я имею в виду большой объем обновлений, например месячные или квартальные расчеты. Простой триггер даст просадку, темпоральная таблица будет лучше, CDC - вообще великолепно. В некоторых случаях историю формируют парой "изменённое поле" - "значение" и помещают в триггер. Фиксация транзакции затягивается. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 01:22 |
|
Журналирование null полей в xml при помощи триггера
|
|||
---|---|---|---|
#18+
Владислав Колосов Под высокой нагрузкой я имею в виду большой объем обновлений, например месячные или квартальные расчеты. Простой триггер даст просадку, темпоральная таблица будет лучше, CDC - вообще великолепно. Разве это так критично, что: "нельзя использовать из за просадки производительности"? Обычная, вполне приемлемая, плата за функциональность. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2019, 08:28 |
|
|
start [/forum/topic.php?fid=46&fpage=76&tid=1686770]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 336ms |
total: | 469ms |
0 / 0 |