Saya terjebak dalam perdebatan di tempat kerja, dan saya butuh nasihat tentang kemungkinan Perangkap yang mungkin saya abaikan.
Bayangkan skenario di mana Pemicu digunakan untuk menyalin Catatan yang Dihapus ke Tabel Audit. Pemicu menggunakan SELECT *. Semua orang menunjuk dan berteriak dan mengatakan betapa buruknya hal ini.
Namun, jika modifikasi dibuat ke Struktur Tabel Utama, dan Tabel Audit diabaikan maka Pemicu akan menghasilkan kesalahan membiarkan orang tahu tabel Audit juga perlu modifikasi.
Kesalahan akan ditangkap saat pengujian pada server DEV kami. Tetapi kita perlu memastikan Production Matches DEV, jadi kami mengizinkan SELECT * dalam Sistem Produksi (hanya Pemicu).
Jadi Pertanyaan saya adalah: Saya didorong untuk menghapus SELECT *, tetapi saya tidak yakin bagaimana lagi untuk memastikan bahwa kami secara otomatis menangkap Kesalahan Pengembangan seperti ini, ada ide atau ini praktik terbaik?
Saya telah mengumpulkan contoh di bawah ini:
--Create Test Table
CREATE TABLE dbo.Test(ID INT IDENTITY(1,1), Person VARCHAR(255))
--Create Test Audit Table
CREATE TABLE dbo.TestAudit(AuditID INT IDENTITY(1,1),ID INT, Person VARCHAR(255))
--Create Trigger on Test
CREATE TRIGGER [dbo].[trTestDelete] ON [dbo].[Test] AFTER DELETE
NOT FOR REPLICATION
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.TestAudit([ID], [Person])
SELECT *
FROM deleted
END
--Insert Test Data into Test
INSERT INTO dbo.Test VALUES
('Scooby')
,('Fred')
,('Shaggy')
--Perform a delete
DELETE dbo.Test WHERE Person = 'Scooby'
PEMBARUAN (ulangi pertanyaan):
Saya seorang DBA dan perlu memastikan Pengembang tidak memberikan skrip Penerapan yang dipikirkan dengan buruk dengan berkontribusi pada Dokumentasi Praktik Terbaik kami. SELECT * menyebabkan kesalahan pada DEV ketika Pengembang mengabaikan Tabel Audit (ini adalah jaring pengaman) sehingga kesalahan tersebut diketahui di awal proses pengembangan. Tetapi di suatu tempat dalam Konstitusi SQL - amandemen ke-2 berbunyi "Jangan gunakan SELECT *". Jadi sekarang ada dorongan untuk menyingkirkan Safety Net.
Bagaimana Anda mengganti Jaring Pengaman, atau haruskah saya menganggap ini sebagai praktik terbaik untuk Pemicu?
PEMBARUAN 2: (solusi)
Terima kasih atas semua masukan Anda, saya tidak yakin apakah saya memiliki jawaban yang jelas karena ini tampaknya menjadi subjek yang sangat abu-abu. Namun secara kolektif Anda telah memberikan poin diskusi yang dapat membantu pengembang kami maju dengan menetapkan Praktik Terbaik mereka.
Terima kasih Daevin
atas kontribusi Anda, jawaban Anda memberikan dasar untuk beberapa mekanisme pengujian yang dapat diterapkan oleh Pengembang kami. +1
Terima kasih CM_Dayton
, saran Anda yang berkontribusi pada praktik terbaik dapat bermanfaat bagi siapa saja yang memicu Pemicu Audit. +1
Terima kasih banyak ypercube
, Anda telah banyak memikirkan masalah tentang tabel yang mengalami berbagai bentuk perubahan definisi. +1
Kesimpulannya:
Is Select * ok in a tigger?
Ya, ini wilayah abu-abu, jangan membabi buta mengikuti ideologi "Select * is Bad".
Am I asking for Trouble?
Ya, kami melakukan lebih dari sekadar menambahkan kolom baru ke tabel.
SELECT *
yang malas, tetapi karena Anda memiliki alasan yang sah untuk menggunakannya, itu lebih abu-abu daripada hitam-putih. Apa yang harus Anda coba lakukan adalah sesuatu seperti ini , tetapi sesuaikan agar tidak hanya memiliki jumlah kolom yang sama, tetapi bahwa nama kolom dan tipe data adalah sama (karena seseorang dapat mengubah tipe data dan masih menyebabkan masalah dalam db yang biasanya tidak ditangkap dengan SELECT *
'jaring pengaman' Anda
SELECT *
sebagai jaring pengaman tetapi tidak akan menangkap semua kasus. Misalnya, jika Anda menjatuhkan kolom dan menambahkannya lagi. Ini akan mengubah urutan kolom dan (kecuali semua kolom dari jenis yang sama) memasukkan ke dalam tabel audit akan gagal atau mengakibatkan hilangnya data karena konversi tipe implisit.