ما هو الأكثر المحمولة وسيلة للتحقق ما إذا كان الزناد موجود في SQL Server?

StackOverflow https://stackoverflow.com/questions/636452

سؤال

أنا أبحث عن معظم المحمولة طريقة للتحقق من وجود الزناد في 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)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top