2014-12-05 2 views
0

Я использую сервер Microsoft SQL Server и основываясь на знаниях sql ... У меня есть таблица, которая содержит имя пациентов и их основных врачей. Я хочу, чтобы проверить, что врач не может быть первичным врачом для более чем 4-х пациентов вот что я пробовал:получение ошибки: «не удалось найти хранимую процедуру» при создании утверждений

CREATE ASSERTION assertion12 
(not exist(
select DOCTOR.SSN 
from Patient, DOCTOR 
where Patient.primaryDoctor_SSN = DOCTOR.SSN 
group by DOCTOR.SSN 
having count(primaryDoctor_SSN) >= 5 
); 

, но я получаю сообщение об ошибке в первой строке: «не удалось найти хранимую процедуру ". (на самом деле красная линия попадает под «CREATE» и показывает это сообщение)

Что мне делать? Я проверяю некоторые сайты, и я видел, что письменные утверждения похожи на то, что я сделал, и я не знаю, почему я получаю эту ошибку.

+0

Если я правильно читать это, вы пытаетесь обеспечить соблюдение максимального количества пациентов для любого конкретного врач? Существует * способ сделать это декларативно в [SQL Server] (http://stackoverflow.com/q/23510713/15498), но я все еще не уверен, что рекомендую его. Вероятно, я все равно спустился бы по триггерному маршруту, чтобы обеспечить такое ограничение. –

+0

Также смотрите http://stackoverflow.com/q/6368349/27535 – gbn

ответ

1

SQL Server не поддерживает Create Assertion, вы можете использовать Check Constraint или Create Trigger как:

IF OBJECT_ID ('assertion12','TR') IS NOT NULL 
    DROP TRIGGER assertion12; 
GO 
-- This trigger prevents a row from being inserted in the Patients table 
-- when current patient's primary doctor already has patients = 4 (max 4) 


CREATE TRIGGER assertion12 ON Patient 
AFTER INSERT 
AS 
IF EXISTS (select count(P.primaryDoctor_SSN) 
      from Patient P 
      JOIN inserted AS i 
      ON p.primaryDoctor_SSN = i.primaryDoctor_SSN 
      group by P.primaryDoctor_SSN 
      having count(P.primaryDoctor_SSN) =4 
     ) 
BEGIN 
RAISERROR ('Primary Doctor Assigned to the Patient already has 4 patients.', 16, 1); 
ROLLBACK TRANSACTION; 
RETURN 
END; 
GO 

-- This statement attempts to insert a row into the Patient table 
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back. 

INSERT INTO Patient values (5,1) 
GO 

DEMO

+0

очень хорошее и приятное решение. Tnks много :) – Kadaj13

+0

У меня вопрос. почему вы пишете «join insert as i»? Я имею в виду, что здесь «вставлено» ?! – Kadaj13

2

SQL Server не поддерживает CREATE ASSERTION.

Фактически, никакие текущие продукты SQL не поддерживают CREATE ASSERTION должным образом. Sybase SQL Anywhere поддерживает его, но, как сообщается, имеет проблемы, позволяющие иногда нарушать ограничения. Rdb действительно поддерживал его, когда он был ухаживал за DEC (который, по-видимому, был влиятельным в первые дни стандартов SQL, вероятно, причина, по которой CREATE ASSERTION находится в стандарте в первую очередь), но этого продукта больше нет.

STOP PRESS: according to their documentation, HyperSQL (HSQLDB) поддерживает утверждения (хотя мне не интересно, почему они не кричат ​​об этом на their list of features).

СсылкаDoes SQL Server 2008 support the CREATE ASSERTION syntax?

+0

Большое спасибо. Вы знаете, как я могу проверить, что эта ситуация не должна произойти ?! (без команды create assertion) – Kadaj13