【发布时间】:2020-12-25 16:37:37
【问题描述】:
我有表 Group 和 Role,用外键链接。我需要通过视图更新它们,所以我必须编写 INSTEAD OF UPDATE 触发器。我目前的解决方案是错误的,我不知道如何解决它。我该如何解决?
表组
CREATE TABLE [Group]
(
groupId INT PRIMARY KEY IDENTITY,
groupName VARCHAR(50) NOT NULL,
picture IMAGE NULL,
CONSTRAINT UniqueGroupName UNIQUE (groupName)
)
表格角色
CREATE TABLE Role
(
roleName VARCHAR(50),
groupId INT,
CONSTRAINT FK_Group FOREIGN KEY (groupId) REFERENCES [Group] (groupId),
PRIMARY KEY (roleName, groupId),
canBan TINYINT DEFAULT (0) /* 0 or 1 */
)
查看
CREATE VIEW GroupRoleView AS
SELECT g.groupName, r.roleName, r.canBan
FROM [Group] as g
INNER JOIN Role AS r ON g.groupId = r.groupId
GO
当前触发器,不正确
CREATE TRIGGER UpdateGroupRoleViewTrigger
ON GroupRoleView
INSTEAD OF UPDATE
AS
BEGIN
DECLARE @tempTable TABLE
(
groupId VARCHAR(50),
roleName VARCHAR(50),
oldBanAbility TINYINT,
newBanAbility TINYINT
)
INSERT INTO @tempTable (groupId, roleName, oldBanAbility, newBanAbility)
SELECT g.groupId, deleted.roleName, deleted.canBan, inserted.canBan
FROM deleted
INNER JOIN inserted ON deleted.groupName = inserted.groupName
LEFT JOIN [Group] as g on deleted.groupName = g.groupName
SELECT * FROM @tempTable
IF (UPDATE(roleName) OR UPDATE(groupName))
THROW 50003, 'You cannot move role between groups or change role name. Delete existing role and create a new one instead of this.', 1
IF (UPDATE(canBan))
BEGIN
--todo
UPDATE Role
SET canBan = (SELECT TOP 1 newBanAbility FROM @tempTable)
WHERE groupId IN (SELECT groupId FROM @tempTable)
AND roleName IN (SELECT roleName FROM @tempTable)
SELECT * FROM deleted
end
end
GO
【问题讨论】:
-
“我当前的解决方案是错误的”和“不正确”并没有给我们太多的帮助。你能再模糊一点吗?除以零?服务器重启?没发生什么事?另外:如果在
update语句中写入列,则update()function 返回true,无论值是否被更改,例如update ... set roleName = roleName ...;. -
CREATE TRIGGER UpdateGroupRoleViewTrigger ON GroupRoleViewForTrigger INSTEAD OF UPDATE?可能是错字?
标签: sql sql-server database tsql