0

我在训练期间,我的教练给了我一些数据库练习。

我必须制作ProjectEmployeeRolesEmployee_Projects_Role表。最后一个表包含从事具有指定角色的项目的员工的详细信息。

他给我的条件是:
1、一个员工可以做多个项目。
2. 一个员工不能在同一个项目中担任不同的角色。

我制作了这些表格并插入了数据。在角色中,我有领导者、经理、开发者的角色。我制作了这些表格并输入了数据。

他检查了我的表格并说一个项目有超过 1 个领导和 1 个经理,所以我限制了列,就像一个项目中不会有相同的角色,但现在我不能在一个项目中输入 2 个开发人员到该映射表。

但是一个项目显然可以有 2 个开发人员。因此,如果您了解整个场景,那么我想问一下,是否可以限制一个特定的列,使其在一个项目中只有一个领导和经理?

我并没有真正进入数据库,但在分配给我一个项目工作之前,他只想复习我的基础知识。所以,我真的很困惑。

这些表的架构如下:

  1. 具有以下字段的项目:project_pid - 主键,project_name

  2. 具有以下字段的员工:employee_pid - 主键、employee_name、gender - M/F、salary、date_of_joining、is_active - Y/N

  3. 具有以下字段的角色:
    role_pid - 主键,role_name -(团队成员或领导)

  4. Employee_Project_Role 具有以下字段:
    project_xid - 外键(引用表 Projects),employee_xid - 外键(引用表 Employee),role_xid - 外键(引用表 Roles)

4

2 回答 2

2

要实现这样的逻辑,您需要使用过程语言。我认为最简单的方法是定义触发器:

CREATE TRIGGER role_restrict
ON employee_project_role
FOR INSERT, UPDATE
AS
  BEGIN
      DECLARE @role VARCHAR(100)
      DECLARE @ldr_xid VARCHAR(100)

      SELECT @role_xid = (SELECT role_xid
                          FROM   inserted)

      SELECT @ldr_xid = (SELECT role_xid
                         FROM   roles
                         WHERE  role_name = "leader")

      IF @role = @ldr_xid
         AND (SELECT Count(*) AS cnt
              FROM   employee_project_role
              WHERE  project_xid = (SELECT project_xid
                                    FROM   inserted)
                     AND role_xid = @ldr_xid) > 1
        /* Cancel the insert, there is already a leader in a project.*/
        BEGIN
            ROLLBACK TRANSACTION
        END
  /* Otherwise we insert the record */
  END  
于 2012-09-15T08:13:25.023 回答
1

您需要取消“每个项目一个角色”的限制,而是创建 T-SQL 存储过程来插入和更新项目员工。

基本上你的表和关系不允许这种复杂的行为。您必须要么创建链接表(我们的经理不允许),要么将逻辑编码到 T-SQL 存储过程中。

T-SQL 程序将允许您执行以下逻辑:

//伪代码

IF newEmployeeToBeInserted.IsManager AND Project_table.ContainsManager
return errorCode
ELSE doInsert
于 2012-09-15T07:53:56.853 回答