เปลี่ยนการจับข้อมูล - จะรู้ได้อย่างไรว่าใครเป็นผู้เปลี่ยนแปลง


10

การติดตามผู้ที่ทำการเปลี่ยนแปลงที่ระบุโดย CDC

ตามแนวของการแฮ็ก datetime ของฉันฉันลองวิธีเดียวกันโดยเพิ่ม suser_sname เป็นฟิลด์ใหม่ที่มีค่าเริ่มต้นในตารางเปลี่ยนแทร็ก cdc แต่ดูเหมือนว่าจะส่งคืนเจ้าของกระบวนการ cdc ไม่ใช่ผู้ใช้ที่เริ่มต้นการเปลี่ยนแปลงบนตารางพื้นฐาน ฉันยังลอง original_login แต่นั่นกลับเข้าสู่บัญชีบริการ sql อีกครั้งน่าจะเกี่ยวข้องกับกระบวนการ cdc ไม่ใช่ผู้ใช้ที่เริ่มต้นการเปลี่ยนแปลง

ฉันพบคำถามที่คล้ายกันใน stack-overflowแต่ไม่มีคำตอบอื่นนอกจากการติดตามการเปลี่ยนแปลงจากส่วนหน้าหรือผ่านทริกเกอร์ซึ่งดูเหมือนว่าจะเอาชนะวัตถุประสงค์ของการใช้ cdc ฉันจะไม่โพสต์ใหม่ แต่เนื่องจากต้นฉบับอยู่ใน stackoverflow ฉันคิดว่าฉันจะลองที่นี่โดยเฉพาะถ้า R2 หรือ 2012 ได้แนะนำวิธีที่ดีกว่า

ในระยะสั้น: ฉันจะรู้ได้อย่างไรว่าใครเป็นผู้ทำการเปลี่ยนแปลงในการเก็บข้อมูลการเปลี่ยนแปลง?

คำตอบ:


7

ฉันยื่นข้อผิดพลาดเกี่ยวกับเรื่องนี้ แต่มันถูกปิดเป็น "โดยการออกแบบ"

http://connect.microsoft.com/SQLServer/feedback/details/283707/cdc-options-to-capture-more-data-username-date-time-etc

น่าเสียดายที่คุณจะต้องใช้เทคนิคอื่น (เช่นการตรวจสอบ SQL หรือทริกเกอร์) เพื่อรับข้อมูลนี้ (และรหัสที่กำหนดเองเพื่อพยายามเชื่อมโยงกับข้อมูล CDC มากที่สุดเท่าที่จะทำได้) ฉันเขียนเกี่ยวกับข้อบกพร่องนี้ในบทของฉัน "การตรวจสอบเซิร์ฟเวอร์ SQL, การติดตามการเปลี่ยนแปลงและการเปลี่ยนแปลงข้อมูล" ในหนังสือSQL Server MVP Deep Dives (ฉบับที่ 1)

ฉันขอโทษที่ฉันไม่มีวิธีแก้ปัญหาที่ดีกว่าสำหรับคุณ แต่ความสามารถในตัวของ CDC ในตัวจะไม่เป็นไปตามความต้องการของคุณ :-(


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

เป็นการดีที่จะทราบฉันคิดว่าปิดหมายถึงการลงคะแนนเช่นกัน ฉันชี้ให้เห็นในความคิดเห็นของฉันที่ Oracle เสนอสิ่งนี้ในการใช้งาน CDC ของพวกเขา มันดูเหมือนว่ามีเหตุผล docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas

6

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

SET @CapturedBy = CAST(REPLACE(CAST(CONTEXT_INFO() AS VARCHAR(10)),CHAR(0),'''''''') AS INT)

IF(@CapturedBy) IS NULL
    BEGIN
       SELECT @CapturedBy = P.[Code]
       FROM sys.dm_exec_sessions AS S
         INNER JOIN [dbo].[Person] AS P
          ON S.[login_name] = P.[User_Name]
       WHERE S.[session_id] = @@spid
    END

0

คุณสามารถเพิ่มฟิลด์ UpdatedBy บนตารางหลักตั้งเป็นค่าเริ่มต้นเป็น SUSER_NAME () หรือ ORIGINAL_LOGIN () และมีข้อมูลนั้นบรรจุอยู่ใน CDC หรือไม่ ฉันเชื่อว่าจะให้ข้อมูลเดียวกับที่คุณต้องการ


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

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

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