2017-01-02 130 views
1

我是SQL中的新手,我想問一個關於觸發器的具體問題。我有一個表購買,我想要更新到其他表具有相同的IDSQL Server觸發器基於表觸發器更新其他表

CREATE TRIGGER tr_EmployeesSalaryPurchasesUpdate 
ON Purchases 
AFTER INSERT 
AS 
BEGIN 
    UPDATE EmployeesSalary 
    SET MonthlySalesMade = MonthlySalesMade + 1 
    WHERE EmployeeID = (SELECT DealMadeByEmployeeID FROM inserted) 
END 

基於當前插入的行。

但它似乎沒有工作(我沒有得到任何錯誤)。

我的數據庫

CREATE DATABASE RealEstateDatabase; 
GO 

USE RealEstateDatabase; 
GO 

CREATE TABLE Employees 
(
    EmployeeID INT IDENTITY NOT NULL PRIMARY KEY, 
    FirstName NVARCHAR(25) NOT NULL, 
    SecondName NVARCHAR(25) NOT NULL, 
    LastName NVARCHAR(25) NOT NULL, 
    NIN NVARCHAR(30) NOT NULL,--National Identification Number (ЕГН) 
    PhoneNumber NVARCHAR(20) NOT NULL, 
    Email NVARCHAR(50) NOT NULL, 
    [Address] NVARCHAR(50) NOT NULL, 

    CONSTRAINT UC_EmployeesNIN UNIQUE (NIN) 
); 
GO 

CREATE TABLE GivingClients -- отдаващи клиенти(наемодатели и продавачи) 
(
    ClientID INT IDENTITY NOT NULL PRIMARY KEY, 
    ClientType NVARCHAR(20) NOT NULL,--Leaser(наемодател) or Seller 
    FirstName NVARCHAR(25) NOT NULL, 
    SecondName NVARCHAR(25), 
    LastName NVARCHAR(25) NOT NULL, 
    NIN NVARCHAR(30) NOT NULL,--National Identification Number (ЕГН) 
    PhoneNumber NVARCHAR(20) NOT NULL, 
    Email NVARCHAR(50), 
    [Town/Village] NVARCHAR(20), 
    [Address] NVARCHAR(50), 
    ServedByEmployeeID INT NOT NULL, -- по EmployeeID 

    CONSTRAINT FK_GivingClients_Employees 
     FOREIGN KEY (ServedByEmployeeID) REFERENCES Employees(EmployeeID), 
    CONSTRAINT CHK_GivingClients CHECK (ClientType IN('наемодател','продавач'))-- наемодател или продавач 
); 
GO 

CREATE TABLE TakingClients -- приемащи клиенти (наематели и купувачи) 
(
    ClientID INT IDENTITY NOT NULL PRIMARY KEY, 
    ClientType NVARCHAR(20) NOT NULL, 
    FirstName NVARCHAR(25) NOT NULL, 
    SecondName NVARCHAR(25), 
    LastName NVARCHAR(25) NOT NULL, 
    NIN NVARCHAR(30) NOT NULL,--National Identification Number (ЕГН) 
    PhoneNumber NVARCHAR(20) NOT NULL, 
    Email NVARCHAR(50), 
    [Town/Village] NVARCHAR(20), 
    [Address] NVARCHAR(50), 
    ServedByEmployeeID INT NOT NULL, -- по EmployeeID 
    ServedByGivingClientID INT, -- връзка към отдаващите клиенти 

    CONSTRAINT FK_TakingClients_Employees 
     FOREIGN KEY (ServedByEmployeeID) REFERENCES Employees(EmployeeID), 
    CONSTRAINT FK_TakingClients_GivingClients 
     FOREIGN KEY (ServedByGivingClientID) REFERENCES GivingClients(ClientID), 
    CONSTRAINT CHK_TakingClients CHECK (ClientType IN('наемател', 'купувач')) 
); 
GO 

CREATE TABLE EstatesBasicInfo 
(
    RealEstateID INT IDENTITY NOT NULL PRIMARY KEY, 
    RealEstateType NVARCHAR(20) NOT NULL,--бизнес имот, къща, апартамент, гараж 
    Area NVARCHAR(25) NOT NULL,--в квадратни метри 
    Architecture NVARCHAR(30), --панел, тухла и т.н. 
    Photos IMAGE, 
    OfferedByEmployeeID INT NOT NULL, 
    [OwnerID] INT NOT NULL, 

    CONSTRAINT FK_EstatesBasicInfo_GivingClients 
     FOREIGN KEY ([OwnerID]) REFERENCES GivingClients(ClientID), 
    CONSTRAINT FK_EstatesBasicInfo_Employees 
     FOREIGN KEY (OfferedByEmployeeID) REFERENCES Employees(EmployeeID) 
); 
GO 

CREATE TABLE EstatesLocation 
(
    RealEstateLocationID INT NOT NULL PRIMARY KEY, 
    Country NVARCHAR(50) NOT NULL, 
    Region NVARCHAR(50) NOT NULL, --Област 
    [Town/Village] NVARCHAR(50) NOT NULL, 
    [Address] NVARCHAR(50) NOT NULL, 

    CONSTRAINT FK_EstatesLocation_EstatesBasicInfo 
     FOREIGN KEY (RealEstateLocationID) REFERENCES EstatesBasicInfo(RealEstateID) 
); 
GO 

CREATE TABLE EstatesDetails 
(
    RealEstateDetailsID INT NOT NULL PRIMARY KEY, 
    Position NVARCHAR(11) NOT NULL,--изток, запад, север, юг, югоизток, югозапад, североизток, северозапад 
    Conditions NVARCHAR(15) NOT NULL, --добри или лоши 
    [Floor] INT NOT NULL, --етажът на който се намира или колко етажа има (в зависимост от видът на обекта) 
    Rooms INT NOT NULL, 

    CONSTRAINT CHK_EstateDetails CHECK (Position IN('изток', 'запад', 'север', 'юг', 'югоизток', 'югозапад', 'североизток', 'северозапад', 'всички') AND [Floor]>=0 AND Rooms>0), 
    CONSTRAINT FK_EstatesDetails_EstatesLocation 
     FOREIGN KEY (RealEstateDetailsID) REFERENCES EstatesLocation(RealEstateLocationID) 
); 
GO 

CREATE TABLE EmployeesSalary 
(
    EmployeeID INT NOT NULL PRIMARY KEY, 
    CurrentSalary MONEY DEFAULT 0,-- на процент 
    MonthlySalesMade INT DEFAULT 0, 
    MonthlyRentsMade INT DEFAULT 0, 

    CONSTRAINT FK_EmployeesSalary_Employees 
     FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID), 
    CONSTRAINT CHK_EmployeesSalary 
     CHECK (CurrentSalary>=0 AND MonthlySalesMade>=0 AND MonthlyRentsMade>=0) 
); 
GO 

CREATE TABLE Purchases 
(
    PurchaseID INT IDENTITY NOT NULL PRIMARY KEY, 
    DateBought SMALLDATETIME NOT NULL, 
    Price MONEY NOT NULL CHECK (Price>0), 
    RealEstateID INT UNIQUE NOT NULL, 
    DealMadeByEmployeeID INT NOT NULL, 

    CONSTRAINT FK_Purchases_EstatesBasicInfo 
     FOREIGN KEY (RealEstateID) REFERENCES EstatesBasicInfo(RealEstateID), 
    CONSTRAINT FK_Purchases_Employees 
     FOREIGN KEY (DealMadeByEmployeeID) REFERENCES Employees(EmployeeID) 
); 
GO 

CREATE TABLE Rents 
(
    RentID INT IDENTITY NOT NULL PRIMARY KEY, 
    StartDate SMALLDATETIME, 
    EndDate SMALLDATETIME, 
    Price MONEY, 
    RealEstateID INT UNIQUE NOT NULL, 
    DealMadeByEmployeeID INT NOT NULL, 

    CONSTRAINT CHK_Rents CHECK (Price > 0 AND EndDate > StartDate), 
    CONSTRAINT FK_Rents_EstatesBasicInfo 
     FOREIGN KEY (RealEstateID) REFERENCES EstatesBasicInfo(RealEstateID), 
    CONSTRAINT FK_Rents_Employees 
     FOREIGN KEY (DealMadeByEmployeeID) REFERENCES Employees(EmployeeID) 
); 
+0

請用你正在使用的數據庫標記你的問題。 –

+0

請下一次 - **只**發佈什麼**相關**到您的問題。我們不需要你的整個數據庫 - 只是那些表示**這個特殊問題的表格...... –

+0

那麼我被問到......所以我......並不是真的當然,如果代碼的某些部分會對其產生影響 – MitkoZ

回答

0

,您的觸發應該適用於單個插入。它是安全使用IN寫:使用JOIN

CREATE TRIGGER tr_EmployeesSalaryPurchasesUpdate 
ON Purchases AFTER INSERT 
AS 
BEGIN 
    UPDATE EmployeesSalary 
    SET MonthlySalesMade = MonthlySalesMade + 1 
    WHERE EmployeeID IN (SELECT DealMadeByEmployeeID FROM inserted) 
END; 

或者:

CREATE TRIGGER tr_EmployeesSalaryPurchasesUpdate 
ON Purchases AFTER INSERT 
AS 
BEGIN 
    UPDATE es 
    SET MonthlySalesMade = es.MonthlySalesMade + 1 
    FROM EmployeesSalary es JOIN 
     inserted i 
     ON es.EmployeeID = i.DealMadeByEmployeeID 
END; 

注意:如果MonthlySalesMade初始化爲NULL而非0,則表達式應該採取NULL考慮:

SET MonthlySalesMade = COALESCE(es.MonthlySalesMade + 1, 1) 
+0

我嘗試了第一種方法,但它不起作用(IN方法) – MitkoZ

+0

@MitkoZ。 。 。這導致我懷疑其他事情出錯了。你的數據模型看起來沒問題。表中是否有匹配的行? –

+0

是的,有... – MitkoZ