การรวบรวมข้อมูลจากตารางที่แตกต่างกันเป็นแบบฝึกหัดหรือไม่


12

พื้นหลัง

ฉันเขียนรายงานขนาดใหญ่จำนวนมากและโดยทั่วไปแล้วรักษาฐานข้อมูลสุขภาพขนาดใหญ่ (เขียน SP, ฟังก์ชั่น, งาน, ฯลฯ ) สคีมาดั้งเดิมและซอฟต์แวร์ที่ใช้นั้นมาจากผู้จำหน่ายรายอื่นดังนั้นฉันจึงไม่สามารถเปลี่ยนแปลงโครงสร้างได้มากนัก มีบันทึกมากมายที่ต้องมีการติดตามเช่นห้องปฏิบัติการขั้นตอนวัคซีน ฯลฯ และพวกมันกระจัดกระจายไปทั่วโต๊ะหลายสิบแห่งซึ่งหลายแห่งถูกป่องและจัดทำดัชนีไม่ดี (ฉันสามารถแก้ไขปัญหานี้ได้บ้าง)

ปัญหา

ปัญหาคือเนื่องจากเรามีการควบคุม DB น้อยและเนื่องจากสามารถเปลี่ยนแปลงได้จากการอัพเดทหรือแพทช์ใด ๆ ทำให้การเขียนและการบำรุงรักษารายงานเหล่านี้ยากและน่าเบื่อโดยเฉพาะอย่างยิ่งเมื่อมีการทับซ้อนกันจำนวนมาก สิ่งที่ต้องทำคือแพทช์เดียวและฉันติดเขียนส่วนใหญ่ของรายงานโหล นอกจากนี้เคียวรีกลายเป็นสับสนและช้าลงเมื่อการรวมซ้อนเลือกและซ้อนกัน

"ทางออก" ของฉัน

แผนของฉันคือการเขียนระเบียนทั้งหมดเหล่านี้ลงในตาราง "catch-all" หนึ่งตารางและเขียนทริกเกอร์บนตารางดั้งเดิมเพื่อรักษาระเบียนในตารางรวมนี้ แน่นอนฉันต้องมั่นใจว่าตัวกระตุ้นของฉันยังคงอยู่หลังจากการอัพเดต แต่จะง่ายกว่ามากจากมุมมองการบำรุงรักษาและเพียงแค่อ้างอิงข้อมูล

ตารางจะบางและยาวเก็บเฉพาะข้อมูลที่ต้องการเช่นนี้:

CREATE TABLE dbo.HCM_Event_Log (
    id INT IDENTITY,
    type_id INT NULL,
    orig_id VARCHAR(36) NULL,
    patient_id UNIQUEIDENTIFIER NOT NULL,
    visit_id UNIQUEIDENTIFIER NULL,
    lookup_id VARCHAR(50) NULL,
    status VARCHAR(15) NULL,
    ordered_datetime DATETIME NULL,
    completed_datetime DATETIME NULL,
    CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id)
)

จากนั้นฉันก็จะมีตารางที่สัมพันธ์กันหลายอย่างสำหรับสิ่งต่าง ๆ เช่นกลุ่ม type_id และรายการ

ฉันเริ่มที่จะเดาความคิดที่สองเนื่องจากตารางเหล่านี้เขียนขึ้นมาไม่มากนัก SP และรายงานที่ฉันกำลังเขียนจะอ้างอิงข้อมูลมากเช่นกัน ดังนั้นฉันกังวลว่าตารางนี้จะกลายเป็นการล็อกระเบียนและฝันร้ายของการแสดงด้วย I / O มากมาย

คำถามของฉัน

เป็นความคิดที่ดีหรือไม่ดี? ฉันรู้ว่าทุกสถานการณ์แตกต่างกันใน SQL Server (2008 r2 Standard Edition BTW) และกฎ "บางครั้ง" แต่ฉันแค่มองหาคำแนะนำทั่วไป

ฉันเริ่มพิจารณาใช้นายหน้าบริการ แต่ฉันจะทำการอัปเดต / แทรกง่าย ๆ เท่านั้น ( ดูทางเลือกของคำตอบที่ยอมรับ ) ข้อมูลในหลาย ๆ กรณีจำเป็นต้องเป็นเรียลไทม์ดังนั้นการใช้ฐานข้อมูลสำรองจะไม่สามารถใช้งานได้จริง ประสิทธิภาพเป็นปัญหาสำหรับเราอยู่แล้ว แต่ส่วนใหญ่เกี่ยวข้องกับฮาร์ดแวร์ที่จะแก้ไขได้ในไม่ช้า


1
คุณสามารถบังคับใช้ตามแผนได้หรือไม่? หากไม่ใช่หนึ่งในการอัปเดตเหล่านั้นสามารถล้างทริกเกอร์และคุณจะไม่อัปเดตการรวมของคุณที่อาจนำไปสู่ข้อมูลที่ไม่ดี
Erik

คุณกำลังพิจารณาที่จะนำข้อมูลทั้งหมดเกี่ยวกับห้องปฏิบัติการและเกี่ยวกับขั้นตอนและเกี่ยวกับวัคซีนและเกี่ยวกับผู้ป่วยมาไว้ในตารางเดียวใช่หรือไม่ ความคิดที่ไม่ดี คุณอาจสามารถใช้แบบแผนดาวถ้าเหมาะสมกับประเภทของข้อความค้นหาที่คุณใช้
Michael Green

1
คุณเคยดูการสร้างมุมมองที่จัดทำดัชนีไว้บ้างไหม? สิ่งเหล่านี้จะวางเลเยอร์แบบลอจิคัลระหว่างรหัสของคุณกับผู้ขายเพื่อให้คุณสามารถอัปเดตมุมมองได้หากผู้ขายเปลี่ยนสิ่งต่าง ๆ ภายใต้ นอกจากนี้มุมมองที่มีการจัดทำดัชนีจะมีการจัดเตรียมไว้ล่วงหน้าสำหรับคุณและให้ประสิทธิภาพการอ่านที่ดี ข้อควรพิจารณาข้อหนึ่งที่ใหญ่กว่าในการทำเช่นนี้คือปริมาณการโหลดในการดำเนินการเขียนของตารางฐานข้อมูลของผู้ขาย อย่างไรก็ตามนี่น่าจะเป็นวิธีที่สะอาดและง่ายต่อการบำรุงรักษามากกว่าการใช้ทริกเกอร์เป็นต้น
Micah Nikkel

ขออภัยสำหรับคนที่ตอบช้าขอบคุณสำหรับความคิดเห็น @Erik - ใช่เราได้วางแผนการอัปเดตแล้วและฉันตรวจสอบเพื่อให้แน่ใจว่าการเปลี่ยนแปลงก่อนหน้านี้ทั้งหมดของฉันยังคงดำเนินการผ่านชุดรายการตรวจสอบสคริปต์ที่ฉันเรียกใช้ดังนั้นจะไม่มีความประหลาดใจใด ๆ ทริกเกอร์ทั้งหมด
jreed121

@MichaelGreen - ฉันจะตรวจสอบโครงสร้างของดาว แต่ฉันอยากรู้ว่าทำไมคุณคิดว่าการมีข้อมูลทั้งหมดในตารางเดียวเป็นความคิดที่ไม่ดี? สภาพแวดล้อมของแอปพลิเคชันนั้นแยกอย่างสมบูรณ์บน VPN แต่ก็ไม่สามารถเข้าถึงได้จากนอกเครือข่าย ถ้ามีอะไรผิดปกติกับโต๊ะมันก็ไม่ใช่จุดจบของโลกเพราะฉันสามารถเขียนทุกอย่างกลับคืนมาได้ ตารางจะไม่ถูกใช้สำหรับข้อมูลที่มีความสำคัญต่อภารกิจหรืออย่างน้อยก็ไม่ใช่ข้อมูลเดียวหรือหลักที่จะเก็บข้อมูล
jreed121

คำตอบ:


8

ถ้าฉันเข้าใจคุณถูกต้อง

  • คุณมีระบบบุคคลที่สามที่มีขนาดใหญ่
  • คุณไม่สามารถควบคุมมันได้
  • คุณสร้างรายงานที่ซับซ้อนที่อ่านข้อมูลโดยตรงจากฐานข้อมูลบุคคลที่สามนี้
  • แบบสอบถามของคุณขึ้นอยู่กับโครงสร้างภายในของฐานข้อมูลบุคคลที่สาม

ฉันจะเข้าใกล้มันเช่นนี้:

  • ตั้งค่าฐานข้อมูลแยกต่างหากซึ่งฉันสามารถควบคุมได้อย่างเต็มที่
  • ตั้งค่ากระบวนการซิงค์ที่อ่านข้อมูลจากตารางและคอลัมน์ที่เกี่ยวข้องจากฐานข้อมูลบุคคลที่สามและแทรก / อัพเดตเข้าไปในเหมือง
  • พัฒนารายงานที่ซับซ้อนของฉันตามโครงสร้างที่มั่นคงของฐานข้อมูลของฉัน

ในกรณีนี้คุณสามารถปรับแต่งโครงสร้างและดัชนีของฐานข้อมูลของคุณเพื่อปรับปรุงประสิทธิภาพของรายงานของคุณโดยไม่ส่งผลกระทบต่อระบบของบุคคลที่สาม เว้นแต่ว่าโครงสร้างข้อมูลดั้งเดิมจะเปลี่ยนแปลงไปอย่างมากตรรกะของข้อความค้นหาของคุณสำหรับรายงานของคุณจะไม่เปลี่ยนแปลงหากมีการเปลี่ยนแปลงฐานข้อมูลบุคคลที่สาม คุณจะต้องปรับกระบวนการซิงค์เท่านั้น

กระบวนการซิงค์เป็นกระบวนการแปลงอย่างมีประสิทธิภาพ- คุณแปลงข้อมูลจากฐานข้อมูลบุคคลที่สามเป็นโครงสร้างที่คุณต้องการ ส่วนหนึ่งของกระบวนการแปลงนี้อาจแก้ไขปัญหาการทำให้เป็นมาตรฐานที่ฐานข้อมูลของบุคคลที่สามดั้งเดิมอาจมี เฉพาะส่วนนี้ของระบบเท่านั้นที่ต้องรู้และพึ่งพาโครงสร้างภายในของระบบบุคคลที่สาม รายงานหลักและแบบสอบถามหลักของคุณจะขึ้นอยู่กับฐานข้อมูลของคุณเท่านั้น

ดังนั้นประเด็นหลักคือ - แยกและ จำกัด ส่วนของระบบของคุณที่ขึ้นอยู่กับ internals ของระบบบุคคลที่สาม

ปรับปรุง

เกี่ยวกับข้อกำหนดแบบเรียลไทม์ BTW ฉันคิดเสมอว่าคำจำกัดความของ "เรียลไทม์" คือ "รับประกันเวลาตอบสนอง" ไม่ใช่ "เวลาตอบสนองเล็กน้อย" ขึ้นอยู่กับใบสมัครของคุณแน่นอน ในทางปฏิบัติของฉันก็เพียงพอแล้วถ้าฉันซิงค์ฐานข้อมูลสองแห่งภายในหนึ่งนาทีของการเปลี่ยนแปลงที่ตรวจพบ หากผู้ใช้เห็นรายงานบนหน้าจอและมีการเปลี่ยนแปลงข้อมูลพื้นฐานรายงานจะต้องถูกเรียกใช้อีกครั้งเพื่อให้สะท้อนถึงการเปลี่ยนแปลงนี้ คุณสามารถสำรวจความคิดเห็นสำหรับการเปลี่ยนแปลงหรือฟังเหตุการณ์ / ข้อความบางอย่างยังคงต้องดำเนินการค้นหารายงานอีกครั้งเพื่อแสดงการเปลี่ยนแปลงล่าสุด

คุณตั้งใจจะเขียนทริกเกอร์เพื่อบันทึกการเปลี่ยนแปลงในตารางดั้งเดิมและเขียนการเปลี่ยนแปลงเหล่านี้ไปยังตารางทั่วไปหนึ่งตาราง ดังนั้นบันทึกการเปลี่ยนแปลงตามที่คุณต้องการ แต่เขียนลงในตารางที่ได้รับการทำให้เป็นมาตรฐานอย่างถูกต้องไม่ใช่ตารางเดียว

ดังนั้นนี้เป็นกรณีที่รุนแรง - การเปลี่ยนแปลงของโครงสร้างข้อมูลของบุคคลที่สามเข้ามาในโครงสร้างข้อมูลภายในของคุณจะดำเนินการในทริกเกอร์ที่ไฟบนINSERT/UPDATE/DELETEของตารางของบุคคลที่สาม มันอาจเป็นเรื่องยุ่งยาก รหัสของทริกเกอร์จะขึ้นอยู่กับโครงสร้างภายในของทั้งสองระบบ หากการแปลงนั้นไม่สำคัญอาจทำให้ความล่าช้าเกิดINSERT/UPDATE/DELETEความผิดพลาดได้ หากมีข้อผิดพลาดในทริกเกอร์ของคุณอาจส่งผลกระทบต่อการทำธุรกรรมเดิมถึงจุดของความล้มเหลว หากระบบของบุคคลที่สามมีการเปลี่ยนแปลงอาจทำให้ทริกเกอร์ของคุณหยุดชะงักซึ่งจะทำให้ธุรกรรมของระบบของบุคคลที่สามล้มเหลว

กรณีที่รุนแรงน้อย ในการทำให้รหัสของทริกเกอร์ของคุณง่ายขึ้นและมีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลงให้เขียนการเปลี่ยนแปลงที่บันทึกไว้ทั้งหมดไปยังตาราง staging / audit / diff บางชุดให้ตั้งค่าสถานะ / ส่งข้อความว่ามีการเปลี่ยนแปลงที่รอดำเนินการและเริ่มกระบวนการแปลงหลัก ผ่านตารางตัวกลางเหล่านี้และทำการแปลง สิ่งสำคัญที่นี่คือกระบวนการแปลงที่อาจเกิดขึ้นอย่างหนักควรเกิดขึ้นนอกขอบเขตของธุรกรรมดั้งเดิม

จากภาพรวมในครั้งที่สองดูเหมือนว่าคำแนะนำดั้งเดิมของคุณจะเป็นไปในทางที่ดี แต่ความแตกต่างคือ: ตารางการดักจับทั้งหมดเก็บข้อมูลไว้ชั่วคราวเท่านั้น ปริมาณข้อมูลมีน้อย - สิ่งที่เปลี่ยนแปลงไป มันไม่จำเป็นต้องเป็นโต๊ะเดียว ในที่สุดข้อมูลจะถูกเก็บไว้ในตารางถาวรแบบปกติที่แยกต่างหากซึ่งคุณสามารถควบคุมได้อย่างสมบูรณ์ซึ่งเป็นอิสระจากระบบของบุคคลที่สามและคุณสามารถปรับแต่งคำถามของคุณได้


หากคุณไปตามเส้นทางการโอนแบทช์เราประสบความสำเร็จกับการติดตามการเปลี่ยนแปลง (และการเก็บข้อมูลการเปลี่ยนแปลงขึ้นอยู่กับความต้องการของคุณ) ด้วยจำนวนธุรกรรมที่ค่อนข้างสูง (100K ต่อวัน) มันง่ายกว่าการใช้ตาราง staging / audit / diff ของคุณเองและสามารถนำไปใช้งานได้โดยไม่ต้องเปลี่ยนรหัสแอปพลิเคชันหรือทริกเกอร์
Michael Green

ไม่ว่าจะเป็นทริกเกอร์หรือ CDC วิธีเดียวที่คุณจะเข้าใกล้แบบเรียลไทม์คือการสตรีมหรือการเข้าคิว การเข้าคิวนั้นเป็นการประนีประนอมที่ดีสำหรับความล่าช้าและประสิทธิผล เวลาของคุณจะถูกใช้ในวิธีการประมวลผลคิวได้เร็วขึ้น ออกจากงานส่วนใหญ่แบบอะซิงโครนัสจากแอปพลิเคชันและทำให้โหลดน้อยลงในธุรกรรมผู้ใช้ ในอดีตที่ผ่านมาฉันทำสิ่งนี้กับ Allscripts Sunrise EMR ด้วยบริการที่ประมวลผลคิวด้วยการโทร C # แบบคู่ขนาน เวลาแฝงทั่วไปสำหรับข้อมูลใหม่ที่จะประมวลผลและพร้อมใช้งานในคลังสินค้าคือ 30 วินาที
แบรด D

ฉันอาจระบุไว้ว่า "เรียลไทม์" เกินกว่าที่ฉันจะไม่กังวลกับมิลลิวินาทีหรือแม้กระทั่ง 5 วินาที แต่ฉันมีข้อสงสัยมากมายที่พนักงานของเราพึ่งพาไดรฟ์เวิร์กโฟลว์ หากลูกค้ามีสิ่งที่ทำกับพวกเขา (ขั้นตอนการสร้างภูมิคุ้มกัน ฯลฯ ) เราจะต้องแสดงให้เห็นในระยะเวลาอันสั้น การแปลงเป็นเรื่องเล็กน้อยและ / หรือแม้แต่การแปลง ฉันไม่ได้กังวลมากเกินไปกับการเปลี่ยนแปลงในตารางผู้ขายเนื่องจากพวกเขาไม่ได้เปลี่ยนบ่อยและฉันต้องทำตอนนี้ต่อไป แต่ความคิดของฉันก็คือการปรับปรุง / สร้างหนึ่งทริกเกอร์ได้ง่ายกว่ารายงาน / คิวรีหนึ่งโหล / สำนัก ฉันรันการตรวจสอบหลังจากอัพเดททุกครั้ง
jreed121

@ jreed121 ผมยังคิดว่ามันเป็นเรื่องง่ายที่จะทริกเกอร์การปรับปรุง (s) จากรายงาน คุณอาจมีทริกเกอร์ในแต่ละตารางที่มาเพื่อจับการเปลี่ยนแปลงดังนั้นจึงมีแนวโน้มที่จะทริกเกอร์มากกว่าหนึ่งตัว ถึงกระนั้นอย่าพยายามเขียนการเปลี่ยนแปลงที่จับได้ทั้งหมดเหล่านี้ลงในตารางที่มีขนาดใหญ่ผิดปกติ เขียนลงในชุดตารางปกติที่ถูกต้อง รายงานของคุณควรเป็นไปตามตารางมาตรฐานเหล่านี้ที่คุณควบคุมและไม่ควรขึ้นอยู่กับตารางดั้งเดิมที่อาจมีการเปลี่ยนแปลง
Vladimir Baranov

3

โดยทั้งหมดใส่ไว้ในชุดตารางมาตรฐานเพื่อให้คุณสามารถปรับเปลี่ยนขั้นตอนการนำเข้าแทนที่จะต้องเปลี่ยนรายงานที่ซับซ้อนและแบบสอบถาม แต่ข้อมูลควรจะยังคงเป็นมาตรฐานซึ่งจะต้องมีตารางทวีคูณ (แต่มีดัชนีที่ดี)

อย่างที่คนอื่น ๆ พูดถึงอย่าใช้ทริกเกอร์ซิงค์เป็นกลุ่ม

ไม่ต้องกังวลกับการเข้าร่วมจำนวนมากเมื่อข้อมูลถูกทำให้เป็นมาตรฐานและจัดทำดัชนีอย่างเหมาะสมสิ่งเหล่านี้จะไม่เพิ่มภาระค่าใช้จ่ายหรือภาระการจัดการที่สำคัญ

เวลาในการทำให้เป็นปกติเหมือนคลังข้อมูลคือเมื่อคุณจำเป็นต้องสร้างคิวรีชนิดต่าง ๆ มากมายบนข้อมูลที่คุณไม่สามารถคาดเดาได้ มันมีข้อเสียและค่าโสหุ้ยของตัวเองและควรใช้ตามความเหมาะสมไม่ใช่สิ่งที่ต้องทำ


3

ฉันทำงานกับสถานการณ์ที่คล้ายกันมากเช่นนี้ในอดีตใน บริษัท ผลิต 24x7 และในที่สุดก็ตัดสินใจใช้การจำลองแบบของทรานแซคชัน มีความเป็นไปได้ที่จะกำหนดค่า DDL ให้ทำซ้ำซึ่งคุณสามารถผลักดันสิ่งที่แพตช์เปลี่ยนไปเป็นสมาชิกได้ เห็นได้ชัดว่ามีข้อดีข้อเสียกับทุกสิ่งและคุณจำเป็นต้องชั่งน้ำหนักพวกเขาเพื่อกำหนดสิ่งที่คุณสามารถสนับสนุนกับสิ่งที่ดีที่สุดสำหรับ บริษัท

ในด้านบวก:

  1. "เรียลไทม์" ถูก จำกัด เฉพาะกับเครือข่ายและการทำธุรกรรมกระทำประสิทธิภาพในการสมัครสมาชิก จากประสบการณ์ของฉันกับระบบ TPS ระดับสูงเราได้รับการจำลองแบบภายในเวลาไม่ถึง 10 วินาทีของข้อมูล "เรียลไทม์"
  2. การแยกเวิร์กโหลด คุณกำลังเรียกใช้งานเวิร์กโหลดแบบผสมบนเซิร์ฟเวอร์เดียว หากคุณสามารถแยกข้อกังวลสองข้อนี้ออกจากกันคุณอาจได้รับประโยชน์ด้านประสิทธิภาพการทำงานของทั้งสองระบบในการลบภาระงานหนึ่งอันออกจากสมการ
  3. ควบคุม. คุณจะสามารถสร้างดัชนี / สถิติ / การแก้ไขบำรุงรักษาเพื่อให้เหมาะกับภาระงานการรายงานของคุณ

มีข้อเสียคือ:

  1. ราคา สิทธิ์ใช้งานและฮาร์ดแวร์เพิ่มเติม (เสมือนหรืออื่น ๆ )
  2. การทำซ้ำ มันใช้งานได้ดีเมื่อทำการติดตั้งอย่างถูกต้อง แต่อาจเป็นเรื่องยุ่งยากที่จะไปถึงจุดนั้น
  3. ซ่อมบำรุง. หากคุณทำการเปลี่ยนแปลงโครงสร้างที่เป็นอันตราย (เช่นวางดัชนี) โครงสร้างเหล่านั้นจะกลับมาเมื่อมีการใช้สแนปชอต (หลังจากที่สิ่งพิมพ์เปลี่ยนแปลงไปหรือเมื่อบทความมีการเปลี่ยนแปลง)

2

แผนของฉันคือการเขียนระเบียนทั้งหมดเหล่านี้ลงในตาราง "catch-all" หนึ่งตารางและเขียนทริกเกอร์บนตารางดั้งเดิมเพื่อรักษาระเบียนในตารางรวมนี้

ทริกเกอร์มีปัญหามากมายที่คุณควรหลีกเลี่ยง:

  • ข้อผิดพลาดในทริกเกอร์อาจทำให้ธุรกรรมเดิมยกเลิก
  • ทริกเกอร์ที่จัดการการดำเนินงานหลายแถวอย่างถูกต้องนั้นยากที่จะเขียน
  • ทริกเกอร์สามารถสร้างความสับสนให้กับแอปพลิเคชันไคลเอนต์โดยการปรับเปลี่ยน rowset ที่ส่งคืน (ตัวอย่างเช่นทริกเกอร์จะแทนที่จำนวนแถวที่ได้รับผลกระทบ)
  • เมื่อทริกเกอร์ตัวหนึ่งทริกเกอร์ตัวอื่นผลลัพธ์จะทำนายยาก

ตัวเลือกที่ดีกว่าคืองานที่คัดลอกข้อมูลไปยังตารางใหม่เป็นระยะ รายงานของคุณสามารถเรียกใช้สำเนาได้ งานที่คัดลอกแถวนั้นง่ายต่อการเขียนและบำรุงรักษาและไม่มีความเสี่ยงที่จะมีผลต่อการทำงานของแอปพลิเคชันบุคคลที่สาม


1.ทริกเกอร์จะง่ายดังนั้นข้อผิดพลาดโยนจะน้อยที่สุดถ้ามีอยู่เลย 2.ทริกเกอร์ตัวเองจะไม่จัดการหลายแถว (IE หนึ่งแถวที่อัพเดทในตารางโดยที่ตัวเรียกไม่ทำให้หลายแถวถูกปรับปรุงที่อื่น) แต่สามารถแทรก / อัพเดต / ลบได้หลายครั้งในแหล่งที่มา ตาราง - คุณหมายถึงอะไร 3.สิ่งนี้ไม่สามารถจัดการได้ด้วยNOCOUNTหรือ 4.ไม่มีทริกเกอร์ใด ๆ บนตารางปลายทางและฉันสามารถรับรองได้เหมือนกันสำหรับคนอื่น ๆ
jreed121

อย่างที่คุณพูดมันเป็นไปได้ในทางทฤษฎีที่จะทำให้ทริกเกอร์ทำงานได้ ในทางปฏิบัติพวกเขาไม่เคยทำ
Andomar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.