วิธีการซ่อน / ปิดการใช้งานตารางโดยไม่ต้องวางเพื่อตรวจสอบความซ้ำซ้อน?


12

ฉันต้องรักษาและขยายระบบเดิมซึ่งมีวิธีการบริการเว็บและตารางฐานข้อมูลที่ไม่ได้ใช้อีกต่อไป เนื่องจากฉันไม่แน่ใจว่าตารางซ้ำซ้อนจริง ๆ ฉันกลัวที่จะทิ้งมัน

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

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

มีตัวเลือกอื่น ๆ หรือมีข้อเสียเปรียบกับวิธี schema?

คำตอบ:


7

มีวิธีอื่นเพื่อให้ได้เหมือนกัน (ตารางไม่สามารถใช้อีกต่อไป) โดยไม่ทิ้ง

การเปลี่ยนแปลงสกีมาเป็นการดำเนินการที่รวดเร็วมาก - เพียงแค่ต้องการเปลี่ยนข้อมูลเมตา ความคิดเดิมที่ผมได้มาจากบล็อกของอาโรนเบอร์ทรานด์ - ใน Schema Switch-A-กินตานาโร

คุณสามารถทำตามขั้นตอนจากคำตอบของฉันที่นี่

เห็นได้ชัดว่ามีวิธีการอื่น ๆ เช่นsp_rename N'old table ', N'new table'หรือเพียงแค่ปฏิเสธการอนุญาตไปยังตาราง


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

@TimSchmelter ดีใจที่คุณพบว่ามีประโยชน์ ไม่เหมาะสมที่จะทำซ้ำที่นี่ว่าบทความหรือคำตอบของฉัน (เชื่อมโยง) นั่นเป็นเหตุผลว่าทำไมฉันถึงได้อ้างอิง
Kin Shah

12

สองสามตัวเลือกอื่น ๆ คือเพียงแค่เปลี่ยนชื่อตารางหรือถ้าพวกเขามีดัชนีคลัสเตอร์คุณสามารถปิดการใช้งานดัชนีคลัสเตอร์


ขอบคุณ ฉันไม่รู้ว่าการปิดใช้งานดัชนีแบบคลัสเตอร์จะทำให้ตารางใช้งานไม่ได้ ข้อดีและข้อเสียของวิธีการเหล่านี้ (+ schema) คืออะไร
Tim Schmelter

5
@TimSchmelter การปิดใช้งาน CI คือการเปิดใช้งานอีกครั้งคุณจะต้องสร้างดัชนีใหม่ อีกตัวเลือกหนึ่งคือการปฏิเสธสิทธิ์บนโต๊ะในบทบาทสาธารณะแม้ว่าเจ้าของฐานข้อมูลหรือผู้ดูแลระบบจะยังคงเห็นพวกเขาและอาจผ่านการผูกมัดเจ้าของ
Martin Smith

ก่อนที่จะวางตารางหรือวางคอลัมน์จากตารางฉันมักจะเปลี่ยนชื่อโดยเพิ่ม "_deprecated" หรือบางส่วนเช่นท้ายชื่อ ถ้าไม่มีข้อผิดพลาดจะต้องไม่มีสิ่งใดอ้างอิง
Jay

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

6

ลบการอนุญาตในตารางออกจากบทบาท / กลุ่ม / บัญชี (s) ที่ [อาจ] ใช้

หากมีอะไรระเบิดขึ้นให้นำ [กลับ] อย่างรวดเร็ว

คำแนะนำ: การใช้สคริปต์เพื่อทำการเปลี่ยนแปลงเหล่านี้จะเป็นความคิดที่ดีจริงๆ


จะทดสอบบนฐานข้อมูลที่ไม่ใช่การผลิต ;) หวังว่านั่นชัดเจนสำหรับ OP แม้ว่า
jpmc26

@ jpmc26 ฉันจะทดสอบในฐานข้อมูลที่ไม่ใช่การผลิตก่อน แต่ปัญหาคือฉันต้องการทราบว่าฟังก์ชั่นหรือวัตถุฐานข้อมูลจะใช้จากภายนอก (ไม่เพียง แต่ผ่านวิธีการบริการเว็บเซอร์ แต่ยังโดยตรงในฐานข้อมูลหรือเครื่องมือผู้ดูแลระบบในสถานที่อื่น ๆ ของ บริษัท )
Tim Schmelter

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

@ jpmc26: ไม่เป็นไรถ้าผู้ดูแลระบบจะตกลงบนใบหน้าของพวกเขาพวกเขาจะรายงาน ไม่ตกลงกับลูกค้า แต่สามารถตรวจสอบได้ในระบบทดสอบก่อนเปิดตัว
Tim Schmelter

3

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

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

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

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

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


3

ลบการอนุญาตตามที่ Phil W. แนะนำ

ลบสิทธิ์จากขั้นตอนการจัดเก็บใด ๆ ที่ใช้ตาราง ใน SQL Server (ฉันไม่รู้เกี่ยวกับผู้อื่น) สิทธิ์ถูกโยงโซ่จากวัตถุที่เรียก (เช่นขั้นตอนการจัดเก็บ) ไปยังวัตถุที่เรียกว่า (เช่นตาราง)


ภารกิจคือให้เครื่องมือฟังก์ชันวัตถุแบบสอบถาม (แม้แต่ในฐานข้อมูลระยะไกล) ทั้งหมดล้มเหลวที่พยายามเข้าถึงตารางเหล่านี้ ถ้าฉันต้องแก้ไขโพรซีเดอร์ที่เก็บไว้ฉันต้องรู้ว่ามันใช้มันแล้ว หรือมีวิธีง่ายๆในการพิจารณาว่าตารางถูกใช้โดยกระบวนงานที่เก็บไว้หรือไม่
Tim Schmelter

ฉันไม่แนะนำให้แก้ไขโพรซีเดอร์ที่เก็บไว้เพียงลบสิทธิ์ EXECUTE เท่านั้น อย่างที่คุณพูดมันเป็นเรื่องง่ายที่จะกู้คืนสิทธิ์หากจำเป็น คุณสามารถดูว่ามีการใช้ตารางใดในขั้นตอนการจัดเก็บ: ใน SQL Server Management Studio, Object Explorer ให้เลือกฐานข้อมูลของคุณ -> ความสามารถในการโปรแกรม -> ขั้นตอนการจัดเก็บ คลิกขวาที่ชื่อ sproc และเลือก View Dependencies เลือกวัตถุที่ขึ้นอยู่กับ [ชื่อ sproc]
ปีเตอร์บิล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.