แบบสอบถามโดยไม่ต้องระบุสคีมาของตาราง


10

ฉันนำเข้าตารางจาก SQL Server 2000 ไปยังฐานข้อมูล 2008 ของฉัน erpadmin.tablenameทุกตารางที่นำเข้าจะมีคำนำหน้าชื่อผู้ใช้ของฉันเช่น:

ในคุณสมบัติตารางจะแสดงรายการ 'erpadmin' เป็น db schema เมื่อฉันเขียนแบบสอบถามตอนนี้ฉันต้องรวม 'erpadmin' ต่อหน้าชื่อตารางทั้งหมดซึ่งทำให้เกิดความสับสน

ผลลัพธ์ปัจจุบัน:

select *
from erpadmin.tablename

ผลลัพธ์ที่ต้องการ:

select *
from  tablename

คำตอบ:


23

หากคุณต้องการกลับไปใช้ dbo schema เช่นเดียวกับที่คุณอยู่ใน SQL Server 2000 คุณสามารถย้ายตารางกลับเข้าไปใน schema dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

อีกทางเลือกหนึ่งหากคุณต้องการมี schema ที่ไม่ใช่ dbo คือการตั้งค่า schema เริ่มต้นของผู้ใช้เป็นerpadminถ้าคุณไม่ได้ระบุ schema มันจะใช้ค่านั้นเป็นค่าเริ่มต้น (สมาชิกของบทบาทเซิร์ฟเวอร์คงที่ดูแลระบบจะละเว้นDEFAULT_SCHEMAและใช้เป็นdboค่าเริ่มต้น)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

ชื่อส่วนที่สองที่คุณมี (schema.table) เป็นนิสัยที่ดีในการเข้าสู่ดังนั้นคุณสามารถชัดเจนกับตารางที่คุณอ้างถึง คุณสมบัติบางอย่างต้องการให้คุณใช้ชื่อสองส่วนมุมมองที่จัดทำดัชนีเป็นตัวอย่างหนึ่ง


17

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

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

เมื่อฉันเขียนแบบสอบถามตอนนี้ฉันต้องรวม 'erpadmin' ต่อหน้าชื่อตารางทั้งหมดซึ่งทำให้เกิดความสับสน

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


3
อีกเหตุผลสำหรับการใช้ชื่อสองส่วนเสมอคือการหลีกเลี่ยงสถานการณ์ที่ผู้ใช้หลายคนเรียกใช้รหัสเดียวกัน (ตัวอย่างselect ... from table5 ;) และรับผลลัพธ์ที่แตกต่างกัน สิ่งนี้ไม่ดีสำหรับการแคชแผนและไม่ดีสำหรับการแก้ไขปัญหา (ผู้สนับสนุนคิว "แบบสอบถามนั้นทำงานได้ดีที่นี่") นอกจากนี้ schemabinding ซึ่งจำเป็นสำหรับการจัดทำดัชนีฟังก์ชั่นและมุมมองต้องใช้ชื่อสองส่วน TLDR: หยุดความขี้เกียจ - ใช้ชื่อสองส่วน
Greenstone Walker

7

ในฐานะที่เป็น @AdamWenger คำตอบ เพื่อสร้างสคริปต์สำหรับการถ่ายโอนไปยัง anothe schema คุณสามารถใช้สคริปต์ต่อไปนี้

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

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

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

หากคุณไม่ได้ทำการโยกย้ายซ้ำด้วยเหตุผลอื่นการถ่ายโอนของ Adam Wenger ควรเป็นตัวเลือกที่ฉลาด


-2

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


3
คุณหมายถึง[database_name]ใช่มั้ย
dezso
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.