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_id
fungsi untuk menemukannya.
SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM sys.triggers AS t;
Demikian juga, saya dapat menemukannya di sys.dm_exec_trigger_stats
. Saya tidak bisa object_name
menyelesaikannya, tetapi object_definition
tidak.
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;
Apakah ada fungsi yang akan menerima id objek pemicu tingkat database, dan mengembalikan namanya?
sql-server
trigger
metadata
ddl-trigger
Erik Darling
sumber
sumber
sys.sql_expression_dependencies
->referenced_id
bergabungsys.objects
?parent_id
kalau menurut bol misalnyaobject_id(object_name(parent_id))
Jawaban:
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 :Dan juga di dalam
OBJECTPROPERTYEX()
dokumen :The
OBJECT_ID()
docs yang sedikit lebih eksplisit:The
OBJECT_NAME()
docs kurang eksplisit, namun mereka menyebutkan batasan yang sama secara implisit (penekanan):Untuk kueri pertama, tidak yakin mengapa Anda perlu mendapatkan nama melalui fungsi, karena
name
kolom disys.triggers
sudah memberi Anda jawaban itu. Untuk kueri kedua, Anda bisa bergabung kesys.triggers
: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.
sumber