2017-11-13 3 views
2

SQLサーバーを使用して単純なトリガーを作成しようとしたときにいくつかのエラーが発生しました。SQLサーバーを使用してトリガーを作成するときに列名が無効

CREATE TABLE person 
(
    person_id INT NOT NULL PRIMARY KEY, 
    name VARCHAR NOT NULL, 
    phone INT, 
    birth_date DATE, 
    address VARCHAR 
); 

CREATE TABLE volunteers 
(
    person_id INT NOT NULL PRIMARY KEY, 
    skill VARCHAR, 
    FOREIGN KEY (person_id) REFERENCES person(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE physicians 
(
    person_id INT NOT NULL PRIMARY KEY, 
    speciality VARCHAR, 
    phone_number INT, 
    FOREIGN KEY (person_id) REFERENCES person(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE patients 
(
    person_id INT NOT NULL PRIMARY KEY, 
    contact_date DATE, 
    physician_id INT, -- TODO determine whether NULL able 
         -- TODO determine ON DELETE ACTION 
    CHECK (person_id <> physician_id), 
    FOREIGN KEY (person_id) REFERENCES person(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
    FOREIGN KEY (physician_id) REFERENCES physicians(person_id) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION 
); 

CREATE TABLE outpatients 
(
    person_id INT NOT NULL PRIMARY KEY, 
    FOREIGN KEY (person_id) REFERENCES patients(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE visits 
(
    person_id INT NOT NULL, 
    date DATE NOT NULL, 
    comments VARCHAR, 
    PRIMARY KEY (person_id, date), 
    FOREIGN KEY (person_id) REFERENCES outpatients(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE employees 
(
    person_id INT NOT NULL PRIMARY KEY, 
    date_hire DATE, 
    FOREIGN KEY (person_id) REFERENCES person(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE nurses 
(
    person_id INT NOT NULL PRIMARY KEY, 
    certificate VARCHAR, 
    care_center_name VARCHAR, 
    FOREIGN KEY (person_id) REFERENCES employees(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
    -- FOREIGN KEY (care_center_name) REFERENCES care_centers(name) 
    --  ON DELETE CASCADE 
    --  ON UPDATE CASCADE 
); 

CREATE TABLE care_centers 
(
    name VARCHAR PRIMARY KEY NOT NULL, 
    nurses_in_charge INT NOT NULL, 
    location VARCHAR, 
    type VARCHAR 
    -- FOREIGN KEY (nurses_in_charge) REFERENCES registered_nurse(person_id) 
); 

CREATE TABLE registered_nurse 
(
    person_id INT NOT NULL PRIMARY KEY, 
    care_center_name VARCHAR, 
    FOREIGN KEY (person_id) REFERENCES nurses(person_id), 
     -- ON DELETE CASCADE 
     -- ON UPDATE CASCADE, 
    FOREIGN KEY (care_center_name) REFERENCES care_centers(name) 
     -- ON DELETE CASCADE 
     -- ON UPDATE CASCADE 
); 


ALTER TABLE nurses 
    ADD constraint nurses__care_centers_FK 
    FOREIGN KEY (care_center_name) REFERENCES care_centers(name) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE; 

ALTER TABLE care_centers 
    ADD constraint care_centers__registered_nurse_FK 
    FOREIGN KEY (nurses_in_charge) REFERENCES registered_nurse(person_id); 

CREATE TABLE beds 
(
    bed_number INT NOT NULL, 
    room_number INT NOT NULL, 
    care_center_name VARCHAR, 
    PRIMARY KEY (bed_number,room_number), 
    FOREIGN KEY (care_center_name) REFERENCES care_centers(name) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE residents 
(
    person_id INT NOT NULL PRIMARY KEY, 
    date_admitted DATE, 
    bed_number INT, 
    room_number INT, 
    FOREIGN KEY (person_id) REFERENCES patients(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
    FOREIGN KEY (bed_number, room_number) REFERENCES beds(bed_number, room_number) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE staffs 
(
    person_id INT NOT NULL PRIMARY KEY, 
    job_class DATE, 
    FOREIGN KEY (person_id) REFERENCES employees(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE technicians 
(
    person_id INT NOT NULL PRIMARY KEY, 
    skill VARCHAR, 
    FOREIGN KEY (person_id) REFERENCES employees(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
); 

CREATE TABLE laboratories 
(
    name VARCHAR NOT NULL PRIMARY KEY, 
    location VARCHAR 
); 

CREATE TABLE assignTechnicianToLab 
(
    person_id INT NOT NULL, 
    laboratories_name VARCHAR NOT NULL, 
    PRIMARY KEY(person_id, laboratories_name), 
    FOREIGN KEY (person_id) REFERENCES employees(person_id) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE, 
    FOREIGN KEY (laboratories_name) REFERENCES laboratories(name) 
     ON DELETE CASCADE 
     ON UPDATE CASCADE 
) 

そして、私が作成しようとしていますトリガ:

-- Trigger 
/* if nurse has certificate "RN", add to registered_nurse */ 
CREATE TRIGGER registered_nurse_trigger 
ON nurses 
FOR INSERT, UPDATE 
AS 
BEGIN 
    IF EXISTS (SELECT * FROM inserted where certificate = "RN") 
    BEGIN 
     INSERT INTO registered_nurse 
     VALUES(inserted.person_id, nurses.care_center_name); 
    END 
END; 

をそして、私はそれを言って、エラー得続ける:

メッセージ207、レベル16、状態1をテーブルが使用して作成されています、プロシージャregistered_nurse_trigger、行6
無効な列名 'RN'です。

メッセージ4104、レベル16、状態1、プロシージャregistered_nurse_trigger、行8
マルチパート識別子 "inserted.person_id"はバインドできませんでした。

メッセージ4104、レベル16、状態1、プロシージャregistered_nurse_trigger、行8
マルチパート識別子「nurses.care_center_name」はバインドできませんでした。

私は数時間ここにぶら下がっています。本当にありがとうございます。どうもありがとうございました!

+1

二重引用符ではなく、 'RN'に一重引用符を使用してください。 –

+0

も不思議です。実際の表名は挿入されていますか?またはユーザーですか? – logger

+0

@logger挿入された新しい行を表す予約語が挿入されていると思いますか? – lyming90

答えて

0

あなたはそのようなVALUES()を使用することはできません。代わりにINSERT..SELECTを使用してください:

-- Trigger 
/* if nurse has certificate "RN", add to registered_nurse */ 
CREATE TRIGGER registered_nurse_trigger ON nurses 
For INSERT, UPDATE 
AS BEGIN 
INSERT INTO registered_nurse (person_id, care_center_name) 
SELECT person_id, care_center_name 
FROM inserted 
WHERE certificate = 'RN' 
END; 

私はあなたがnursesを参照するか、どちらかEXISTS()、多分私が何かを見下ろすてることを持っている必要はないと思います。

+0

@ lyming90うまくいって、ハッピーコーディング。 –

0

あなたの作成トリガー文で単一引用符の代わりに二重引用符を使用している、これを試してみて、それが動作するかどうかを確認:

-- Trigger 
/* if nurse has certificate "RN", add to registered_nurse */ 
CREATE TRIGGER registered_nurse_trigger ON nurses 
    FOR INSERT, UPDATE 
AS 
    BEGIN 
     IF EXISTS (SELECT * FROM inserted where certificate = 'RN') 
     BEGIN 
      INSERT INTO registered_nurse 
       SELECT person_id, care_center_name FROM Inserted; 
     END 
    END; 
+0

ありがとう!しかし、私はまだ "xxxは縛られることができませんでした"というエラーを出しています。テーブルが空であるのでそれは可能でしょうか? – lyming90

+0

あなたのトリガーを今すぐ更新しました。 –

+0

ありがとう、私は今少し修正しました。 :) – lyming90

関連する問題