6.2 假设有如下两个关系模式: Emp(Eno, Ename, Eage, Salary, Deptno) Dept(Deptno, Dname, Phone, Loc)
现在有三个用户U1,U2和U3。史使用SQL的授权语句实现下列要求。 (1) U1只能读Emp关系中除了 salary以外的所有属性。 Grant select(Eno, Ename, Eage, Deptno) on emp to U1;
(2) U2可以读、增、删Dept关系,并可以修改此关系的Phone属性。 Grant select,insert,delete,update(phone) on dept to u2;
(3) U3可以读、增、Dept关系,并可将这些权限转授给其他用户。 Grant select,insert on dept to U3 with grant option; (4) 所有用户可以读Dept关系。 Grant select on dept to public;
6.7请用SQL语句创建题目6.2中Emp和Dept关系,并有以下约束。 (1) Dept的主键是Deptno,Emp的主键是Eno。 (2) Emp的外键是Deptno,被参考的关系是Dept。 (3) Emp的 Eage取值在20~60之间。 (4) Dept的Dname是惟一的并且非空。 (5) Emp的Salary >1000。 说明:本题只要求创建EMP
CREATE TABLE DEPT
(Deptno Char(4) Primary Key,
Dname Varchar(10) unique not null, Phone Varchar(12), Loc Varchar(50)
Primary Key(Deptno),
或 Constraint Pk_Sc Primary Key(Deptno) );
CREATE TABLE EMP
(Eno Char(8) Primary Key, Ename Varchar(10), Eage Smallint
[Constraint C1] Check(Eage >=20 and Eage<=60), Salary Numeric(7,2) check (Salary >1000), Deptno Char(4) References Dept(Deptno) ,
[Constraint Fk_Deptno] Foreign Key (Deptno) References Dept(Deptno) );
6.9在题目6.2中定义的Emp和Emp关系中,试用触发器表示下列完整性约束。 (1) 20≤Eage≤60;
create trigger tri_update_eage_emp on emp for insert,update as declare @Eage smallint begin
select @eage=eage from inserted if (@eage<20 or @eage>60) begin
raiserror('年龄不在合法范围内',16,1) rollback transaction end end
(2) 1000≤Salary≤10000;
create trigger tri_update_salary_emp on emp for insert,update as declare
@salary Numeric(7,2) begin
select @salary=salary from inserted if (@salary<1000 or @salary>10000) begin
raiserror('工资的取值不在有效范围内',16,1) rollback transaction end end
(3) 当插入或者修改 一个职工记录的时候,如果工资低于1000元则自动改为1000元。
create trigger insert_or_update_emp on emp for insert,update as declare @eno Char(8), @salary Numeric(7,2) begin
select @eno=eno from inserted select @salary=salary from inserted if (@salary<1000)
update emp set salary=1000 where eno= @eno end 或
create trigger insert_or_update_emp on emp for insert,update as begin
update emp set salary=1000 where eno in
(select eno from inserted where salary<1000) end
如果写在一起:不过最好按照上述三个写 create trigger insert_or_update_emp on emp for insert,update as
declare @eno Char(8), @eage smallint, @salary Numeric(7,2) begin
select @eno=eno from inserted select @eage=eage from inserted select @salary=salary from inserted if (@eage<20 or @eage>60) begin
raiserror('年龄不在合法范围内',16,1) rollback transaction end else
if (@salary>10000) begin
raiserror('工资的取值不在有效范围内',16,1) rollback transaction end
else
if (@salary<1000)
update emp set salary=1000 where eno= @eno end
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务