Permintaan tanpa harus menentukan skema tabel


10

Saya mengimpor banyak tabel dari SQL Server 2000 ke database 2008 saya. Semua tabel impor diawali dengan nama pengguna saya misalnya: erpadmin.tablename.

Dalam properti tabel ia mencantumkan 'erpadmin' sebagai skema db. Ketika saya menulis kueri, saya sekarang harus memasukkan 'erpadmin.' di depan semua nama tabel yang membingungkan.

Hasil saat ini:

select *
from erpadmin.tablename

Hasil yang diinginkan:

select *
from  tablename

Jawaban:


23

Jika Anda ingin kembali menggunakan skema dbo seperti Anda berada di SQL Server 2000, Anda bisa memindahkan tabel kembali ke skema dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Alternatif jika Anda suka memiliki skema non-dbo adalah dengan mengatur skema default pengguna Anda erpadminkemudian jika Anda tidak menentukan skema, itu akan menggunakannya sebagai default. (Anggota peran server tetap sysadmin mengabaikan DEFAULT_SCHEMAdan menggunakan dbosecara default.)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

Dua nama bagian yang Anda miliki (schema.table) adalah kebiasaan yang baik untuk dimasukkan, jadi Anda bisa secara eksplisit dengan tabel yang Anda maksud. Beberapa fitur mengharuskan Anda untuk menggunakan nama dua bagian, Indexed Views adalah salah satu contohnya.


17

Ini adalah kasus klasik mengapa Anda harus menentukan nama skema ketika mengakses objek database. Ketika tidak ditentukan dan Anda mencoba mengakses objek dalam skema non-default maka Anda akan mengalami masalah yang Anda lihat sekarang.

Perbaikan sebenarnya adalah mengubah aplikasi Anda (atau agen kueri apa pun yang Anda miliki saat ini yang menyebabkan masalah) menjadi eksplisit.

Ketika saya menulis kueri, saya sekarang harus memasukkan 'erpadmin.' di depan semua nama tabel yang membingungkan.

Itu tidak membingungkan, itu konvensi penamaan yang eksplisit . Saya sarankan Anda tetap menggunakan nomenklatur itu untuk menghindari pengocokan objek dan inkonsistensi.


3
Alasan lain untuk selalu menggunakan nama dua bagian adalah untuk menghindari situasi di mana banyak pengguna mengeksekusi kode yang sama (misalnya select ... from table5 ;) dan mendapatkan hasil yang berbeda. Ini buruk untuk caching paket dan juga buruk untuk pemecahan masalah (isyarat dukungan orang, "permintaan itu berjalan dengan baik di sini"). Selain itu, schemabinding, yang diperlukan untuk pengindeksan fungsi dan tampilan, memerlukan dua nama bagian. TLDR: berhenti malas - gunakan dua nama bagian.
Greenstone Walker

7

Sebagai tambahan jawaban @AdamWenger. Untuk membuat skrip untuk mentransfer ke skema lain, Anda dapat menggunakan skrip berikut

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

Masalah Anda kemungkinan karena cara migrasi dilakukan. Barang-barang tidak boleh dilampirkan pada pengguna Anda, kecuali jika Anda dianggap sebagai pemiliknya.

Skema ada untuk membantu Anda memisahkan tabel dengan apa pun yang masuk akal. Misalkan Anda memiliki satu tabel sumber daya untuk departemen SDM dan menginginkan tabel sumber daya yang terpisah untuk departemen produksi, sekaligus mempertahankan keduanya pada database yang sama. Dalam hal ini Anda dapat memiliki dua tabel bernama sumber daya, satu di skema produksi dan satu lagi di skema SDM. Itu sebabnya shcemas harus ditentukan, kecuali Anda membawa barang ke skema default.

Jika Anda tidak mengulangi migrasi untuk alasan lain, maka transfer Adam Wenger harus menjadi pilihan yang bijaksana.


-2

Mulai perintah Anda dengan USE [tablename] kueri Anda tidak memiliki database terkait untuk referensi dan database yang Anda lihat bukan default untuk pengguna yang login Di bagian atas jendela permintaan itu mungkin mengatakan "master"


3
Maksudmu [database_name]benar?
dezso
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.