我使用外键来防止在孩子使用密钥后在某些SQL表中删除行。但是,现在我希望能够在子项使用密钥后限制父表的任何列。
例如,如果父表是 [ID],[名字],[姓氏]
子表是 [ListID],[Emp ID]
外键阻止我删除或更新父表中的[ID],但它不会阻止我修改[名字]。有没有办法设置外键来防止这种情况?
感谢。
答案 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
此外,总是尝试批量处理触发器中的逻辑,以免损害性能。