【问题标题】:SQL How to restrict parent row from updates once child added?SQL如何在添加子项后限制父行更新?
【发布时间】:2017-11-15 15:11:00
【问题描述】:

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

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

子表是 [ListID],[Emp ID]

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

谢谢。

【问题讨论】:

  • 你的 rdbms 是什么?您需要BEFORE UPDATE trigger ...但不确定是否要禁止表上的每个更新。你知道人们可以改名吗?
  • 不,我的父表和子表看起来不像这样,我只是想轻松说明我想要完成的任务 - 如果且只有一个子表,则防止更新父表的选择列添加了引用父键的记录
  • 我正在使用 MS SQL Server

标签: sql sql-server tsql foreign-keys


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    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
    

    此外,请始终尝试批量处理触发器中的逻辑,以免影响性能。

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多