Sql 如何使用复合主键从表中删除?
我有组合主键的表角色。我必须从中删除值,并检查它们是否不等于触发器中的某个值。我需要怎么做 表的代码:Sql 如何使用复合主键从表中删除?,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我有组合主键的表角色。我必须从中删除值,并检查它们是否不等于触发器中的某个值。我需要怎么做 表的代码: CREATE TABLE Role ( roleName VARCHAR(50), groupId INT, CONSTRAINT FK_Group FOREIGN KEY (groupId) REFERENCES [Group] (groupId), PRIMARY KEY (roleName, groupId), canBan TINYINT
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 TRIGGER DeleteRoleTrigger
ON [Role]
INSTEAD OF DELETE
AS
BEGIN
IF 'everyone' IN (SELECT roleName FROM deleted)
BEGIN
THROW 50002, 'Cannot delete role "everyone"! Nothing is deleted', 1
-- id severity state
END
ELSE
BEGIN
-- todo
DELETE
FROM Role
WHERE (EXISTS(SELECT groupId, roleName FROM deleted))
PRINT N'Роль удалена'
END
END
GO
问题可能出现在存在SELECT groupId、roleName FROM deleted的行。我建议在delete语句中使用内部联接,如下所示
DELETE r
FROM Role r
INNER JOIN deleted d
ON r.groupId = d.groupId AND r.roleName = d.roleName
问题可能出现在存在SELECT groupId、roleName FROM deleted的行。我建议在delete语句中使用内部联接,如下所示
DELETE r
FROM Role r
INNER JOIN deleted d
ON r.groupId = d.groupId AND r.roleName = d.roleName
您可能需要更改此触发器的其他部分
DELETE r
FROM [Role] r join deleted d
on (r.groupId = d.groupId and r.roleName =d.roleName)
或
您可能需要更改此触发器的其他部分
DELETE r
FROM [Role] r join deleted d
on (r.groupId = d.groupId and r.roleName =d.roleName)
或
exists子查询与外部delete查询不相关。如果删除中存在任何行,则它将删除角色中的所有行。可能不是所需的功能。exists子查询与外部delete查询不相关。如果删除中存在任何行,则它将删除角色中的所有行。可能不是期望的功能。