SQL如何在添加子项后限制更新父行?

时间:2017-11-14 19:49:37

标签: sql sql-server tsql foreign-keys

我使用外键来防止在孩子使用密钥后在某些SQL表中删除行。但是,现在我希望能够在子项使用密钥后限制父表的任何列。

例如,如果父表是 [ID],[名字],[姓氏]

子表是 [ListID],[Emp ID]

外键阻止我删除或更新父表中的[ID],但它不会阻止我修改[名字]。有没有办法设置外键来防止这种情况?

感谢。

2 个答案:

答案 0 :(得分:0)

你可以使用而不是触发器。

CREATE TABLE [dbo].[ParentTable]
(
ID INT, FirstName VARCHAR(50), LastName VARCHAR(50)
)
go

CREATE table ChildTable(EmpID INT)

go

CREATE TRIGGER [dbo].[ParentTable_InsteadOfUPDATE]
       ON [dbo].[ParentTable]
INSTEAD OF UPDATE
AS
BEGIN


       DECLARE @ID INT, @FirstName VARCHAR(50), @LastName VARCHAR(50)

       SELECT @ID = INSERTED.ID,
              @FirstName = INSERTED.FirstName,
              @LastName = INSERTED.LastName       
       FROM INSERTED

    IF EXISTS(select top 1 1 from DBO.ChildTable Where EmpID=@ID )
    BEGIN

       IF UPDATE([ID]) OR UPDATE([FirstName]) OR UPDATE([LastName])
       BEGIN
              RAISERROR('These fields cannot be updated.', 16 ,1)
              ROLLBACK
       END    
    END
    ELSE
    BEGIN
        Update [ParentTable] SET FirstName=@FirstName,LastName=@LastName Where ID=@ID;
    END   
END
go

答案 1 :(得分:0)

试试这个:

CREATE TRIGGER trg_name ON parent_table INSTEAD OF UPDATE
AS
BEGIN

    UPDATE parent_table
    SET [FirstName] = I.[firstname]
       ,[LastName] = I.[lastname]
     FROM parent_table A
     INNER JOIN inserted B
        ON A.[ID] = B.[ID]
     LEFT JOIN child_table CT
        ON A.[ID] = CT.[ListID] -- or [EmpID] - am not sure about the relation
     WHERE CT.[LsitID] IS NULL  -- where the element from parent_table does not have element in the child table

END

此外,总是尝试批量处理触发器中的逻辑,以免损害性能。