這個謎題我看的真是。。。。大費腦子。但是總算學會了點東西
這個謎題描述為:有一個資料庫記錄缺勤者。當嚴重性積分達到40分,則自動被解僱。當僱員連續缺勤超過一天,則被認為是長假,第二第三等天都不會統計僱員的嚴重性分數,也不算缺勤。
CREATE Personnel<br />(<br />emp_id INTEGER PRIMARY KEY<br />);<br />CREATE TABLE Absenteeism<br />(<br />emp_id INTEGER NOT NULL REFERENCES Personnel(emp_id) ON DELETE CASCADE,<br />absent_date DATE NOT NULL,<br />reason_code CHAR(40) NOT NULL,<br />severity_points INTEGER NOT NULL CHECK(severity_points BETWEEN 0 AND 4)<br />);
當某個Personnel自動解僱時,Absenteeism的相應記錄就會被刪除,因此我們用串聯刪除技術。
1.怎麼管理長假問題。
這裡我們用到觸發器。觸發器講解見我另一篇文章。
當向Absenteeism中插入一條tuple時,則對於每條記錄進行分析,如果發現兩條記錄的時間是連續的,則把後一個時間的嚴重性積分變為0.
create trigger name on Absenteeism<br />for INSERT<br />as<br />IF update(absent_date)<br />begin<br /> UPDATE Absenteeism<br /> set severity_points=0,<br /> reason_code='long term illness'<br /> where exists<br /> (select *<br /> from Absenteeism as A2<br /> where DATEDIFF(dd, A2.absent_date, Absenteeism.absent_date)=1<br /> AND Absenteeism.emp_id=A2.emp_id)<br />end<br />
2.自動解僱問題
這個問題我問了csdn的高手~他們給我的解答是用SQL代理。定時檢測給定SQL語句,這樣就能實現,當然也可以用觸發器,當向Absenteeism插入一個元組,則觸發此語句。
------------------------------------------------------------------------------------------------------------------
management studio中
--SQL Server代理
--右鍵作業
--新增作業
--"常規"項中輸入作業名稱
--"步驟"項
--建立
--"步驟名"中輸入步驟名
--"類型"中選擇"Transact-SQL 指令碼(TSQL)"
--"資料庫"選擇執行命令的資料庫
--"命令"中輸入要執行的語句:
你要執行的sql語句
--確定
--"計劃"項
--建立計劃
--"名稱"中輸入計劃名稱
--"計劃類型"中選擇你的作業執行安排
--如果選擇"反覆出現"
--點"更改"來設定你的時間安排
然後將SQL Agent服務啟動,並設定為自動啟動,否則你的作業不會被執行
設定方法:
我的電腦--控制台--管理工具--服務--右鍵 SQLSERVERAGENT--屬性--啟動類型--選擇"自動啟動"--確定.
----------------------------------------------------------------------------------------------------------------------
delete from Personnel<br />where emp_id= (<br />select A1.emp_id<br />from Absenteeism as A1<br />where A1.emp_id=Personnel.emp_id<br />AND absent_date<br />BETWEEN DATEADD(dy,-365,GETDATE())<br />AND GETDATE()<br />GROUP BY A1.emp_id<br />having sum(severity_points)>=40<br />);
以下是用於定時檢測自動刪除那些時限超過一年的到期記錄。
delete from Absenteeism<br />where absent_date BETWEEN DATEADD(dy,-365,GETDATE())<br />AND GETDATE();
總結:
1.on delete cascade
2.trigger
3.SQLAgent