Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用复合主键从表中删除?_Sql_Sql Server_Database_Tsql - Fatal编程技术网

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查询不相关。如果删除中存在任何行,则它将删除角色中的所有行。可能不是期望的功能。