【正文】
t 39。city_def39。,39。city39。exec sp_unbindefault 39。city39。drop default city_def實驗十二 對于CPXS數(shù)據(jù)庫,刪除CP表、CPXSB表、XSS表上已有所有約束:實體完整性的實現(xiàn)(1)對CP表、CPXSB表、XSS表,定義主鍵約束(用企業(yè)管理器和SQL語句分別實現(xiàn),寫出相應過程和語句)。 alter table CP add constraint cp_pk primary key (產(chǎn)品編號)alter table CPXSBadd constraint cpxsb_pk primary key (產(chǎn)品編號,客戶編號,銷售日期)alter table XSS add constraint xss_pk primary key (客戶編號)(2)在CP表的產(chǎn)品名稱列定義一個唯一約束(用企業(yè)管理器和SQL語句分別實現(xiàn),寫出相應過程和語句)。alter table CPadd constraint 產(chǎn)品名稱_uk unique (產(chǎn)品名稱)參照完整性的實現(xiàn)(1)利用企業(yè)管理器建立CP表與CPXSB之間的參照關系,當對主表CP表進行更新和刪除操作時, 從表CPXSB采用NO ACTION方式,寫出其過程。alter table CPXSBadd constraint CP_CPXSB_FK foreign key(產(chǎn)品編號) references CP(產(chǎn)品編號) on delete no action on update no action(2)利用SQL語句建立CPXSB與XSS表之間的參照關系,當對主表XSS表進行更新和刪除操作時,從表CPXSB采用CASCADE(級聯(lián))方式,寫出其過程。alter table CPXSBadd constraint XSS_CPXSB_FK foreign key (客戶編號) references XSS(客戶編號)on delete cascadeon update cascade域完整性的實現(xiàn)(1)在CP表的價格列上定義大于等于0的檢查(CHECK)約束。 alter table CPadd constraint 價格_CK check (價格0) (2)定義一個大于等于0的規(guī)則check_kcl,并將其綁定到CP表的庫存量列,然后解除綁定,刪除該規(guī)則,請寫出相關SQL語句。create rule check_kcl as @kcl=0sp_bindrule 39。check_kcl39。,39。39。sp_unbindrule 39。39。drop rule check_kcl綜合訓練創(chuàng)建一個“學生檔案”數(shù)據(jù)庫,并用CREATE TABLE在該數(shù)據(jù)庫中創(chuàng)建“人事”表和“成績”兩個表,其中“人事”表包括學號、姓名、性別、電話號碼、家庭住址字段組成。“成績”表包括學號、選修課程名稱、成績三個字段。分別在“人事”表的學號字段設置主鍵約束,在“成績”表的學號字段設置外鍵約束,在成績字段設置大于等于0小于等于100的檢查約束,在家庭住址字段設置惟一約束,在性別字段設置默認值為“男”。create database 學生檔案on( name=39。學生檔案_data39。, filename=39。c:\sql\data\39。)log on(name=39。學生檔案_log39。, filename=39。c:\sql\log\39。)create table 人事( 學號 char(8) primary key, 姓名 char(16), 性別 char(2) default 39。男39。, 電話號碼 char(12), 家庭住址 char(50) unique)create table 成績( 學號 char(8) foreign key references 人事(學號), 選修課程名稱 char(16), 成績 numeric(9) check(成績=0 and 成績=100))實驗十三對于CPXS數(shù)據(jù)庫,創(chuàng)建如下存儲過程: 無參存儲過程編寫一無參存儲過程用于查詢每個客戶購買產(chǎn)品的情況(包括客戶編號、產(chǎn)品編號、客戶名稱、產(chǎn)品名稱、價格、購買日期、購買數(shù)量),然后調用該存儲過程。create procedure gmqkasselect ,客戶名稱,產(chǎn)品名稱,價格,銷售日期 as 39。購買日期39。,數(shù)量 as39。購買數(shù)量39。from CP,XSS,CPXSBwhere = and =exec gmqk帶有參數(shù)的存儲過程編寫一加密存儲過程,查詢指定客戶購買產(chǎn)品的情況。并調用該存儲過程查詢客戶編號為“000002”的客戶購買情況。 create procedure gmqk1 @客戶編號 char(6) with encryptionasselect ,客戶名稱,產(chǎn)品名稱,價格,銷售日期 as 39。購買日期39。,數(shù)量 as39。購買數(shù)量39。from CP,XSS,CPXSBwhere = and = and =@客戶編號exec gmqk1 39。00000239。帶有通配符參數(shù)的存儲過程編寫一存儲過程,查詢指定產(chǎn)品的銷售情況。如果沒有提供參數(shù),則查詢產(chǎn)品名稱中包含有“冰箱”的產(chǎn)品銷售情況。create procedure xsqk @產(chǎn)品名稱 char(30)=39。冰箱39。asselect ,產(chǎn)品名稱,客戶編號,銷售日期,數(shù)量,銷售額from CP,CPXSBwhere = and 產(chǎn)品名稱=@產(chǎn)品名稱exec xsqk 39。彩色電視機39。帶有OUTPUT參數(shù)的存儲過程編寫一存儲過程,查詢指定客戶在指定時間段內購買指定產(chǎn)品的數(shù)量,存儲過程中使用了輸入和輸出參數(shù)。并調用該存儲過程查詢名稱為“家電市場”的客戶在2004年購買“洗衣機”的數(shù)量。create procedure gmqk2 @客戶名稱 char(30),@year char(4),@產(chǎn)品名稱 char(30),@數(shù)量 int output as select @數(shù)量=sum(數(shù)量) from CP,XSS,CPXSBwhere = and = and 客戶名稱=@客戶名稱 and datepart(yy,銷售日期)=@year and 產(chǎn)品名稱 = @產(chǎn)品名稱declare @數(shù)量 intexec gmqk2 39。家電市場39。,39。200439。,39。洗衣機39。,@數(shù)量 outputselect @數(shù)量 as 購買數(shù)量 帶有OUTPUT游標參數(shù)的存儲過程編寫一帶有OUTPUT游標參數(shù)的存儲過程,游標結果集為客戶信息,并通過調用該存儲過程,實現(xiàn)依次讀取游標CUR2中各行數(shù)據(jù)。create procedure kh_cursor @kh_cursor cursor varying outputasset @kh_cursor=cursor forselect * from XSSopen @kh_cursordeclare @kh cursorexec kh_cursor @kh_cursor=@kh outputfetch next from @kh while @@fetch_status=0 fetch next from @khclose @khdeallocate @kh實驗十四對于CPXS數(shù)據(jù)庫,完成如下各項: 編寫存儲過程,對產(chǎn)品銷售表進行插入操作,并通過觸發(fā)器保證插入時,產(chǎn)品編號與CP表中的對應字段一致, 銷售商編號與銷售商表中對應字段一致。其中觸發(fā)器分別用后觸發(fā)器和替代觸發(fā)器實現(xiàn)。create trigger insert_exists1 on CPXSB for insertas if not exists (select * from CP where 產(chǎn)品編號=(select 產(chǎn)品編號 from inserted)) or not exists (select * from XSS where 客戶編號=(select 客戶編號 from inserted) ) begin raiserror(39。數(shù)據(jù)不一致39。,16,1) rollback transaction endcreate trigger insert_exists2 on CPXSB instead of insertas begin if not exists (select * from CP where 產(chǎn)品編號=(select 產(chǎn)品編號 from inserted)) or not exists (select * from XSS where 客戶編號=(select 客戶編號 from inserted) ) begin raiserror(39。數(shù)據(jù)不一致39。,16,1) rollback transaction endelse insert CPXSB select * from inserted endcreate procedure insert_cpxsb @產(chǎn)品編號 char(6),@客戶編號 char(6),@銷售日期 datetime,@數(shù)量 int,@銷售額 realas insert into CPXSB values(@產(chǎn)品編號,@客戶編號,@銷售日期,@數(shù)量,@銷售額)exec insert_cpxsb 39。10000139。,39。00000139。,39。200651839。,3,5600alter table CPXSBadd constraint CPXSB_PK primary key (產(chǎn)品編號,客戶編號,銷售日期) 在CPXSB上創(chuàng)建一后觸發(fā)器,若對產(chǎn)品編號列和客戶編號列修改,則給出提示信息,并取消修改操作,用兩種方法實現(xiàn)。create trigger update_cpxsb1 on cpxsb for updateas if update(產(chǎn)品編號) or update(客戶編號) begin raiserror(39。不允許修改39。,16,1) rollback transaction endcreate trigger update_cpxsb2 on cpxsb instead of updateasif(columns_updated()amp。3)0begin raiserror(39。不允許修改39。,16,1) rollback transaction enddrop trigger insert_exists2update cpxsb set 產(chǎn)品編號=39。10000939。where 產(chǎn)品編號=39。20000139。實驗十五創(chuàng)建Windows NT登錄帳戶在SQL Server中添加一個帳戶名為“WANG”的Windows NT登錄帳戶。sp_grantlogin st29\WANGsp_revokelogin st29\WANG 創(chuàng)建SQL Server登錄帳戶在SQL Server中添加一個帳戶名為“LIU”,密碼為“123456”的SQL Server登錄帳戶。sp_addlogin LIU,123456sp_droplogin LIU 添加服務器角色成員將“WANG”這個Windows NT登錄帳戶添加到系統(tǒng)管理員服務器角色中。sp_addsrvrolemember st29\WANG,sysadminsp_dropsrvrolemember st29\WANG,sysadmin添加一個登錄帳戶為某個數(shù)據(jù)庫的用戶將“LIU” 這個SQL Server登錄帳戶添加為CPXS數(shù)據(jù)庫中一個用戶,名稱也為“LIU”。sp_grantdbaccess LIU,LIU添加數(shù)據(jù)庫角色在CPXS數(shù)據(jù)庫中添加一個名為“ROLE”的角色。sp_addrole ROLE 添加數(shù)據(jù)庫角色成員將CPXS數(shù)據(jù)庫中名為“LIU”這個用戶添加為“ROLE”角色成員。sp_addrolemember ROLE,LIU用戶、角色的授權 授予“LIU”用戶和“ROLE”角色對CPXSB表的查詢權限和數(shù)量列的修改權限。grant select ,update(數(shù)量) on CPXSB to LIU with Grant optiongrant select,update(數(shù)量) on CPXSB to role with Grant option 收回用戶、角色的收回“LIU”用戶的所有權限。并查看是否能打開CPXSB表。revoke all from LIU 拒絕用戶、角色的權限 重新授予“LIU”用戶對CPXSB表的查詢權限和數(shù)量列的修改權限。再拒絕該用戶的所有權限。并查看是否能打開CPXSB表,并通過此實例闡述收回權限與拒絕權限的區(qū)別。deny all to LIU 57