Bagaimana saya bisa menyelesaikan nama pemicu basis data dengan fungsi bawaan?

8

Saya memiliki pemicu basis data yang saya gunakan untuk mencegah saya membuat prosedur tertentu dalam basis data pengguna.

Muncul di sys.triggers, dengan object_id, tetapi saya tidak dapat menggunakan object_idfungsi untuk menemukannya.

SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM   sys.triggers AS t;

GILA

Demikian juga, saya dapat menemukannya di sys.dm_exec_trigger_stats. Saya tidak bisa object_namemenyelesaikannya, tetapi object_definitiontidak.

SELECT OBJECT_NAME(dets.object_id, dets.database_id) AS object_name,
       OBJECT_DEFINITION(dets.object_id) AS object_definition,
       *
FROM   sys.dm_exec_trigger_stats AS dets;

GILA

Apakah ada fungsi yang akan menerima id objek pemicu tingkat database, dan mengembalikan namanya?

Erik Darling
sumber
Tidak 100% yakin tetapi bisakah Anda mencoba sys.sql_expression_dependencies-> referenced_idbergabung sys.objects?
Kin Shah
@Kin itu tidak muncul di sys> objek atau semua objek. Sangat aneh!
Erik Darling
Itu menarik .. bagaimana parent_idkalau menurut bol misalnyaobject_id(object_name(parent_id))
Kin Shah

Jawaban:

9

Pemicu tingkat database dan server tidak dicakup sebagai "objek" per se (inilah sebabnya Anda tidak dapat membuatnya di bawah skema, dan mengapa mereka tidak muncul di dalamnya sys.objects).

Anda dapat melihat bahwa benda-benda tersebut memiliki batasan-batasan tertentu pada mereka, misalnya dalam satu OBJECTPROPERTY()dokumen :

Fungsi ini tidak dapat digunakan untuk objek yang tidak dibatasi skema, seperti pemicu bahasa definisi data (DDL) dan pemberitahuan acara.

Dan juga di dalam OBJECTPROPERTYEX()dokumen :

OBJECTPROPERTYEX tidak dapat digunakan untuk objek yang tidak dibatasi skema, seperti pemicu bahasa definisi data (DDL) dan pemberitahuan acara.

The OBJECT_ID()docs yang sedikit lebih eksplisit:

Objek yang tidak termasuk skema, seperti pemicu DDL, tidak dapat ditanyakan dengan menggunakan OBJECT_ID. Untuk objek yang tidak ditemukan di tampilan katalog sys.objects, dapatkan nomor identifikasi objek dengan menanyakan tampilan katalog yang sesuai. Misalnya, untuk mengembalikan nomor identifikasi objek pemicu DDL, gunakan SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog'.

The OBJECT_NAME()docs kurang eksplisit, namun mereka menyebutkan batasan yang sama secara implisit (penekanan):

Mengembalikan nama objek database untuk objek yang dicakup skema .


Untuk kueri pertama, tidak yakin mengapa Anda perlu mendapatkan nama melalui fungsi, karena namekolom di sys.triggerssudah memberi Anda jawaban itu. Untuk kueri kedua, Anda bisa bergabung ke sys.triggers:

SELECT tr.*, ts.*
FROM sys.dm_exec_trigger_stats AS ts
LEFT OUTER JOIN sys.triggers AS tr
ON ts.[object_id] = tr.[object_id];

Anda bisa membuat fungsi Anda sendiri, tentu saja, tetapi saya tidak tahu ada fungsi bawaan yang melakukan korelasi ini untuk Anda (dan saya sarankan tinggal jauh dari fungsi metadata bawaan pada umumnya ).

Pemicu DDL adalah jenis hewan khusus. Jadi jika Anda khawatir juga harus bergabung dengan sys.procedures, sys.views, dll., Jangan.

Aaron Bertrand
sumber
Terima kasih, Aaron. Tidak, saya merasa aneh karena mereka tidak menyelesaikannya dengan normal . Senang bahwa daging aneh tidak membunuhmu;)
Erik Darling