有無論如何我可以創建一個觸發器,在更新/刪除發生之前執行(然後實際更新/刪除發生)?以及我如何才能從表中觸發drop
?如何在SQL Server 2005中更新觸發器之前創建
1
A
回答
0
下降TRIGGER- use database_name
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'tgr_name' AND type = 'TR')
DROP TRIGGER tgr_name
GO
1
這從微軟的文章介紹如何創建觸發器的語法。
http://msdn.microsoft.com/en-us/library/ms189799.aspx
是不是真的有一個「前」觸發,但您可以使用INSTEAD OF觸發器,可以讓你在任何地方採取行動試圖跳,然後定義你自己的行動。
我已經使用該技術來版本化數據。
CREATE TRIGGER [dbo].[Documents_CreateVersion]
ON [dbo].[Documents]
INSTEAD OF UPDATE
AS
BEGIN
DECLARE @DocumentID int
SELECT DocumentID = DocumentID FROM INSERTED
-- do something
END
插入的是一個有點用詞不當的位置,但它包含了操作的詳細信息時,那麼你可以定義與數據你自己的行動之前。
編輯:
按我下面的響應意見,如果多個行一次更新我的例子可能是危險的。我的應用程序不允許這樣,所以在這種情況下很好。我會同意上述是不好的做法。
1
下降觸發器使用:
--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用戶childcount如果是超過5 不要更新user.how我可以做 ,而不是觸發器?
您並不真的需要阻止原始更新,您可以讓它發生,然後在觸發器中檢查問題並在必要時進行回滾。這是如何執行的邏輯,一個或多個受影響的行,當你需要加入,以確定受影響的行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,忽略了失敗的需求(沒有錯誤消息)所有受影響行。
0
下面是一個簡單的觸發器,用於檢查列值,並在更新或插入之前觸發並引發錯誤。
IF OBJECT_ID ('dbo.MyTableTrigger', 'TR') IS NOT NULL
DROP TRIGGER dbo.MyTableTrigger;
GO
CREATE TRIGGER MyTableTrigger
ON dbo.MyTable
FOR INSERT, UPDATE
AS
DECLARE @Col1ID INT
DECLARE @Col2ID INT
SELECT @Col1ID = Col1ID, @Col2ID = Col2ID FROM inserted
IF ((@Col1ID IS NOT NULL) AND (@Col2ID IS NOT NULL))
BEGIN
RAISERROR ('Col1ID and Col2ID cannot both be in MyTable at the same time.', 16, 10);
END
相關問題
- 1. 觸發SQL Server 2005之前
- 2. 如何在SQL Server 2005中使用觸發器進行更新
- 3. 如何在T-SQL 2005的刪除之前觸發觸發器?
- 4. 觸發器在SQL Server 2005
- 5. 更改Sql Server 2005中的觸發器
- 6. 如何在SQL Server 2008上創建插入更新觸發器
- 7. 創建無法在SQL Server 2005中禁用的觸發器
- 8. 如何爲自動更新創建觸發器與SQL Server 2008
- 9. SQL Server 2005 SQLAgent觸發器
- 10. SQL Server 2005複製觸發器 - 如何?
- 11. 我的SQL觸發器更新之前
- 12. SQL Server 2005 - 觸發器沒有觸發
- 13. 創建更新觸發器
- 14. SQL Server觸發器更新
- 15. 更新觸發器SQL Server
- 16. 爲什麼如果我在SQL Server 2005中創建觸發器而不是更新,我的表不更新?
- 17. 在SQL Server中創建觸發器
- 18. 在sql server中更新觸發器
- 19. 如何在更新觸發之前更改插入觸發器之前?
- 20. 如何在MS SQL 2005中創建觸發器
- 21. 如何在SQL Server 2005觸發器中插入或更新dbf文件?
- 22. 如何在SQL Server上或之前選擇創建觸發器2008
- 23. SQL Server 2005觸發器更新遠程服務器
- 24. SQL Server 2012.觸發器。如何在創建表時自動創建觸發器
- 25. SQL Server 2005中觸發
- 26. zend框架:如何在插入/更新之前/之後創建觸發器
- 27. 如何在pl中創建更新觸發器查詢sql
- 28. SQL Server 2005中觸發器的問題
- 29. SQL Server:在「當前」表更新爲「歷史」表時創建一個觸發器
- 30. 如何在遠程SQL Server 2005/2008數據庫上創建觸發器?
嗨,更新刪除之前需要執行的實際原因是什麼? – Dom 2010-10-27 14:44:00