ما هو الأكثر المحمولة وسيلة للتحقق ما إذا كان الزناد موجود في SQL Server?
-
10-07-2019 - |
سؤال
أنا أبحث عن معظم المحمولة طريقة للتحقق من وجود الزناد في MS SQL Server.فإنه يحتاج إلى العمل على الأقل SQL Server 2000 و 2005 و يفضل 2008.
المعلومات لا يبدو أن يكون في INFORMATION_SCHEMA ، ولكن إذا كان هناك في مكان ما ، وأود أن تفضل استخدامه من هناك.
أنا أعرف هذه الطريقة:
if exists (
select * from dbo.sysobjects
where name = 'MyTrigger'
and OBJECTPROPERTY(id, 'IsTrigger') = 1
)
begin
end
ولكن لست متأكدا ما إذا كان يعمل على كافة إصدارات SQL Server.
المحلول
وهذا يعمل على SQL Server 2000 وفوق
IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') = 1
BEGIN
...
END
علما أن من السذاجة الحديث لا يعمل بشكل موثوق:
-- This doesn't work for checking for absense
IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') <> 1
BEGIN
...
END
لأن إذا كان الكائن لا وجود لها على الإطلاق ، OBJECTPROPERTY
يعود NULL
, ، NULL
هو (طبعا) لا <> 1
(أو أي شيء آخر).
في SQL Server 2005 أو في وقت لاحق, يمكنك أن تستخدم COALESCE
للتعامل مع ذلك ، ولكن إذا كنت بحاجة إلى دعم SQL Server 2000 يجب أن هيكل العبارة الخاصة بك للتعامل مع ثلاثة احتمال عودة القيم: NULL
(كائن لا وجود له على الإطلاق) ، 0
(كان موجودا ولكن ليس الزناد) ، أو 1
(إنه الزناد).
نصائح أخرى
هناك أيضا المفضل "sys.مشغلات" عرض الكتالوج:
select * from sys.triggers where name = 'MyTrigger'
أو الاتصال على sp_Helptrigger المخزنة proc:
exec sp_helptrigger 'MyTableName'
ولكن بخلاف ذلك, أعتقد ذلك حول هذا الموضوع :-)
مارك
تحديث (على ياكوب Januszkiewicz):
إذا كنت بحاجة إلى تضمين معلومات المخطط, يمكنك أيضا أن تفعل شيئا مثل هذا:
SELECT
(list of columns)
FROM sys.triggers tr
INNER JOIN sys.tables t ON tr.parent_id = t.object_id
WHERE t.schema_id = SCHEMA_ID('dbo') -- or whatever you need
على افتراض أنه هو DML الزناد:
IF OBJECT_ID('your_trigger', 'TR') IS NOT NULL
BEGIN
PRINT 'Trigger exists'
END
ELSE
BEGIN
PRINT 'Trigger does not exist'
END
لأنواع أخرى من الكائنات (طاولات, مناظر, مفاتيح, أيا كان...) ، انظر: http://msdn.microsoft.com/en-us/library/ms190324.aspx تحت عنوان 'النوع'.
اختبار لا يعمل على SQL Server 2000:
select * from sys.triggers where name = 'MyTrigger'
اختبارها ويعمل موافق على SQL Server 2000 و SQL Server 2005:
select * from dbo.sysobjects
where name = 'MyTrigger' and OBJECTPROPERTY(id, 'IsTrigger')
بالإضافة إلى ممتازة الإجابة من قبل marc_s:
إذا كان وجود الاختيار المقصود قبل إسقاط أو تعديل تؤدي في بعض الطريق ، استخدام مباشر tsql ضمن try/Catch
بوك, أسرع وسيلة.
على سبيل المثال:
BEGIN TRY
DROP TRIGGER MyTableAfterUpdate;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS erno WHERE erno = 3701; -- may differ in SQL Server < 2005
END CATCH;
رسالة الخطأ سوف يكون
Cannot drop the trigger 'MyTableAfterUpdate', because it does not exist or you do not have permission.
ثم ببساطة التحقق إذا أعدم النتيجة عاد الصفوف أو لا ، التي هي سهلة في sql المباشر وكذلك برنامجي واجهات برمجة التطبيقات (C#,...).
هي الزناد أسماء اضطر أن تكون فريدة من نوعها في SQL server?
كما مشغلات بالتعريف تطبيقها على جدول معين فإنه لن يكون أكثر كفاءة لتقييد البحث فقط الجدول في السؤال ؟
لدينا قاعدة بيانات مع أكثر من 30 ألف الجداول في كل منها واحد على الأقل الزناد قد يكون أكثر (سيئة DB التصميم جدا ربما ، ولكن كان من المنطقي سنوات ولم مقياس جيد)
يمكنني استخدام
SELECT * FROM sys.triggers
WHERE [parent_id] = OBJECT_ID(@tableName)
AND [name] = @triggerName
وأود أن استخدام بناء الجملة هذا إلى التحقق من وإسقاط الزناد
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[SCHEMA_NAME].[TRIGGER_NAME]') AND type in (N'TR'))
DROP TRIGGER [SCHEMA_NAME].[TRIGGER_NAME]
إذا كنت تحاول العثور على ملقم راقب DDL الزناد على SQL Server 2014, عليك أن تحاول sys.server_triggers.
IF EXISTS (SELECT * FROM sys.server_triggers WHERE name = 'your trigger name')
BEGIN
{do whatever you want here}
END
لو قلت تو أي شيء غير صحيح, يرجى اسمحوا لي أن أعرف.
تحرير:لم تحقق هذه dm على آخر إصدارات SQL Server.
التي تم إنشاؤها بواسطة Studio إدارة ملقم Sql:
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[RolesYAccesos2016_UsuariosCRM_trgAfterInsert]'))
DROP TRIGGER [dbo].[RolesYAccesos2016_UsuariosCRM_trgAfterInsert]
GO
CREATE TRIGGER [dbo].[RolesYAccesos2016_UsuariosCRM_trgAfterInsert]
ON [PortalMediadores].[dbo].[RolesYAccesos2016.UsuariosCRM]
FOR INSERT
AS
...
بالنسبة select @@version
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1797.0 (X64) 1 يونيو 2011 15:43:18 حقوق الطبع والنشر (c) Microsoft Corporation Enterprise Edition (64 بت) على Windows NT 6.1 (Build 7601:حزمة الخدمة Service Pack 1) (Hypervisor)