для сброса триггера используйте:
--SQL Server 2005+, drop the trigger, no error message if it does not exist yet
BEGIN TRY DROP TRIGGER dbo.TrigerYourTable END TRY BEGIN CATCH END CATCH
GO
--drop trigger pre-SQl Server 2005, no error message if it does not exist yet
if exists (select * from sysobjects where id = object_id(N'[dbo].[TrigerYourTable ]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger [dbo].[TrigerYourTable ]
GO
OP сказал в комментарии:
... предположим, что мне нужно проверить дочерний счет пользователя в perticular, если это большечем 5 не обновлять пользователя. Как я могу сделать это, используя вместо триггера?
Вам действительно не нужно предотвращать исходное обновление, вы можете позволить этому произойти, а затем в триггерепроверьте наличие проблемы и выполните откат при необходимости.Вот как следует применять логику для одной или нескольких затронутых строк, когда вам нужно присоединиться, чтобы определить childcount
затронутых строк:
--create the trigger
CREATE TRIGGER dbo.TrigerYourTable ON dbo.YourTable
AFTER UPDATE
AS
SET NOCOUNT ON
IF EXISTS (SELECT
1
FROM INSERTED i
INNER JOIN YourChildrenTable c ON i.ParentID=c.ParentID
GROUP BY i.ParentID
HAVING COUNT(i.ParentID)>5
)
BEGIN
RAISERROR('Count of children can not exceed 5',16,1)
ROLLBACK
RETURN
END
GO
Он выдаст ошибку, если произойдет нарушениелогика и исходная команда будут подвергаться откату.
Если childcount
является столбцом в затронутой таблице, тогда используйте триггер, подобный этому, чтобы применить логику:
--create the trigger
CREATE TRIGGER dbo.TrigerYourTable ON dbo.YourTable
AFTER UPDATE
AS
SET NOCOUNT ON
IF EXISTS (SELECT 1 FROM INSERTED WHERE childcount>5)
BEGIN
RAISERROR('Count of children can not exceed 5',16,1)
ROLLBACK
RETURN
END
GO
Если вы просто хотите игнорировать обновление для любых строк, которыенарушите правило, попробуйте следующее:
--create the trigger
CREATE TRIGGER dbo.TrigerYourTable ON dbo.YourTable
INSTEAD OF UPDATE
AS
SET NOCOUNT ON
UPDATE y
SET col1=i.col1
,col2=i.col2
,col3=i.col3
,.... --list all columns except the PK column!
FROM dbo.YourTable y
INNER JOIN INSERTED i on y.PK=i.PK
WHERE i.childcount<=5
GO
Он будет обновлять только строки с количеством дочерних элементов менее 5, игнорируя все затронутые строки, которые не соответствуют требованию (без сообщения об ошибке).