Latar belakang :
Kami mencoba membuat AG "harness test" utama untuk salah satu tim pendukung kami. Tidak mengetahui server mana pada waktu tertentu akan menjadi yang utama mereka telah diperintahkan untuk mengeksekusi TSQL terhadap kelompok server terdaftar. Grup server terdaftar terdiri dari semua server di AG. Tujuannya adalah hanya menjalankan TSQL di server utama saat ini:
Test Harness saat ini :
IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id
WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END
Masalah :
Jika server pertama yang merespons kembali ke kueri multi-server tidak mengembalikan hasil apa pun, SSMS akan menganggap set hasil yang tepat tidak ada set hasil, bahkan jika server lain kemudian kembali dengan set hasil. Jadi dalam skenario ini, tidak ada hasil yang dikembalikan ... ini tidak benar dan bukan fungsi yang diharapkan.
Adakah yang bisa memikirkan cara, dengan SSMS (ini adalah alat yang paling akrab bagi tim CS), untuk memaksa eksekusi hanya pada server utama saat ini?
sumber
Jawaban:
Saya telah mengalami ** ini sebelumnya, dan jika saya ingat dengan benar, untuk memastikan selalu mendapatkan hasil dengan permintaan multi-server Anda perlu memaksakan hasil kosong yang ditetapkan ketika tidak ada baris yang akan dikembalikan. Artinya, Anda memerlukan
ELSE
cabang tentang ituIF
dan di dalamELSE
Anda akan melakukan sesuatu seperti berikut:Ini menghasilkan set hasil kosong yang memiliki nama dan tipe data yang tepat.
ATAU, dan saya belum pernah mencoba ini di masa lalu (hanya memikirkannya saat saya mengetik ini), tetapi Anda mungkin bisa lolos dengan hanya menjeda di
ELSE
cabang itu sehingga server utama / yang dimaksudkan diperbolehkan untuk selalu mengembalikan nya hasil ditetapkan pertama (yang merupakan masalah sebenarnya di sini: server pertama yang merespons menetapkan struktur yang harus dipatuhi semua tanggapan lainnya). Karenanya, berikut ini mungkin berfungsi sebagai satu-satunya hal diELSE
:Tapi saya tidak ingat jika server lain tidak mengembalikan hasil sama sekali menyebabkan pesan kesalahan ditampilkan di tab "Pesan". Jika itu terjadi, maka set hasil kosong pasti cara untuk pergi. Tetapi jika ini berhasil, maka ini mungkin bekerja lebih baik di template umum (seperti kasus Anda tampaknya) karena tidak perlu menyesuaikan paksa, hasil kosong yang ditetapkan setiap kali digunakan.
MEMPERBARUI:
OP memverifikasi bahwa:
WAITFOR DELAY
memang bekerja, dan** Situasi yang saya temui mirip, tetapi tidak ada hubungannya dengan Grup Ketersediaan atau menginginkan hasil dari hanya satu server. Situasi kami adalah bahwa kami memiliki 18 server dengan skema yang sama dengan data yang berbeda dan perlu melakukan berbagai tugas pemeliharaan, agregasi di seluruh 18 node. Ada beberapa prosedur tersimpan yang, untuk alasan apa pun, kadang-kadang tidak mengembalikan set hasil apa pun, dan apa pun alasannya itu tidak dapat diperbaiki dalam prosedur tersimpan. Jadi, tergantung pada simpul mana yang kembali lebih dulu, sebagian besar waktu semuanya baik-baik saja, tetapi sesekali simpul yang kadang-kadang kembali tidak ada hasil yang disetel dikembalikan terlebih dahulu. Jadi, saya harus melakukan sesuatu seperti membuang hasil ke tabel temp dan jika
@@ROWCOUNT
ituINSERT...EXEC
adalah 0, maka saya akan memilih paksa, kosong hasil yang ditetapkan.sumber
WAITFOR DELAY
pendekatan dan bahwa Anda mengonfirmasi itu berhasil, jadi terima kasih untuk itu!Saya selalu menggunakan tabel temp untuk mengembalikan hasil untuk mendapatkan respons yang konsisten dari semua server dalam grup. Kueri multi server adalah salah satu hal favorit saya tentang SSMS.
sumber