2015-04-22 51 views
0

嘗試爲特定列創建觸發器,但只能獲得整個表才能工作的觸發器。爲高速列創建觸發器

Create Trigger Nameblock on tblcustomer 
    For Insert 
    As 
    Begin 
    rollback transaction 
    print 'Name edit not allowed!' 
    End 

我想它,所以它只有一個更新客戶名稱做這在表

+0

可能重複(http://stackoverflow.com/questions/4097949/mysql-trigger-只有問題觸發當列被更改) – Liron

+0

我見過這個,但NEW和OLD命令似乎不適用於我。 – user2437672

+0

這個觸發器不會在mysql上工作,更多的提供了一些關於你試圖實現的更多信息。 –

回答

1
Create Trigger Nameblock on tblcustomer 
For Update 
As 
if UPDATE(name) 
Begin 
    rollback transaction 
    RAISERROR('Name edit not allowed!',16,1) 
End 

覆蓋點評論一欄,你可以使用下面的觸發也創造了扳機。

Create Trigger Nameblock on tblcustomer 
INSTEAD OF UPDATE 
As 
Begin 
    UPDATE tblcustomer set phone=I.phone,address=I.adress 
    from INSERTED I inner join tblcustomer on (tblcustomer.id=I.id) 
    where I.name=tblcustomer.name 

    if UPDATE(name) 
     print 'Name edit not allowed!' 
END 
+1

但請注意,這會回滾整個事務,所以如果他們改變了任何東西,它也會回滾。這也意味着,如果他們用一個查詢更改了400條記錄,並且只有一個名稱更改,則整個事務將回滾。 – HLGEM

+1

這是一個很好的觀點我認爲你可以用INSTEAD OF UPDATE觸發器解決這些問題,然後你不需要使用回滾事務,你可以忽略名稱列已更改的行 – Mohsen

+1

另一個問題是客戶名稱實際上確實發生了變化。人們結婚或離婚,公司被買斷或改變他們的名字。如果觸發器永遠不會允許任何人更改名稱,你將如何處理?觸發器會影響數據的所有更改。這是由應用程序更好地完成嗎?爲什麼該字段在應用程序中可編輯? – HLGEM

0

看起來你很近。添加IF UPDATE(客戶名稱)應該這樣做:

CREATE TRIGGER Nameblock ON tblcustomer 
FOR UPDATE --change this to update instead of insert 
AS 
BEGIN 
    IF UPDATE (CustomerName) --Add this line to your query 
    BEGIN 
    rollback transaction 
    print 'Name edit not allowed!' 
    END 
END 
GO 
[MySQL的觸發問題?:只有當一列被改變觸發]的