无需另一个就防止列更改

时间:2017-03-31 22:51:46

标签: sql sql-server-2012

除非邮政编码列也更新,否则不应允许任何人更新客户地址列。如果尝试更新一个而不另一个,则会触发一个触发器,并显示一条错误消息。

有关如何在Microsoft SQL Server 2012中执行此操作的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以使用以下逻辑

CREATE TRIGGER [dbo].AU_MyTrigger ON [dbo].MyTable
FOR  UPDATE
AS 
BEGIN
    declare @bu_addr varchar(100)
    declare @bu_zip varchar(100)
    declare @au_addr varchar(100)
    declare @au_zip varchar(100)

    select @bu_addr = addr, @bu_zip = zip from DELETED
    select @au_addr = addr, @ay_zip = zip from INSERTED
    if (@bu_addr <> @au_addr) and (@bu_zip = @au_zip)
    BEGIN
        -- update table with old values
        -- raise error
    END
END

请注意,如果此更新可以批量发生,则需要循环遍历每条记录并将其值更新为old,并且仅在触发结束时(循环外)返回错误。在这种情况下,要迭代更新的行,您需要使用CURSOR

你的情况可能不像我解释的那么容易,但这是有效的方法。