【发布时间】:2015-05-14 10:53:42
【问题描述】:
我正在尝试在 SQL Server 中创建检查约束。
我有一个名为Studies 的表,其中包含“pnr”、“courseCode”、“assignment”。
我有一张名为Student 的表,其中包含“pnr”。
我有一个名为Course 的表,其中包含'courseCode'。
我有一个名为Assignment 的表,其中包含'courseCode'、'assignment'、'assignmentPoints'。
现在我想检查是否可以防止管理员将pnr 插入Studies,如果pnr 目前已经参加了价值很高的课程,则限制为45 分。
我已经做到了这一点,但它不起作用。
create function EnrollmentFunction (@pnr varchar(10)) returns varchar(10)
as
begin
if exists (
select sum(assignmentPoints) as Points
from Assignment a
join Studies s
on a.courseCode = s.courseCode
and a.assignmentName = s.assignmentName
and a.sectionName = s.sectionName
and pnr = @pnr
where assignmentPoints > 45)
return 'False'
return 'True'
end
alter table Studies
with check add constraint CK_Points
check (dbo.EnrollmentFunction(pnr) = 'True')
但是,当我对该特定学生运行插入并添加一门课程时,该学生已经超过其通过的分数限制,检查不会阻止插入。
请帮忙!
【问题讨论】:
-
您是否需要 pnr 的总分配点 > 45 或课程和作业的任何一个分配点 > 45?
-
你的函数忽略了它的参数。这可能是首先要解决的问题。
-
学生已经获得的总分不得超过45分。
-
将 pnr 值硬编码到该函数中是不是一个错误。
-
我只是用那个值来测试,也可以是@pnr,但没有区别。