--用戶管理模塊數據庫設計 drop database UsersDBTest --------------建立數據庫---------------------------- create database UsersDBTest --sqlserver這一句話就能夠建立數據庫,其它默認值。 on primary -- 默認就屬於primary文件組,可省略 ( /*--數據文件的具體描述--*/ name='UsersDBTest_data', -- 主數據文件的邏輯名稱 filename='E:\DB\UsersDBTest_data.mdf', -- 主數據文件的物理名稱和地址 size=5mb, --主數據文件的初始大小 maxsize=100mb, -- 主數據文件增加的最大值 filegrowth=15%--主數據文件的增加率 ) log on ( /*--日誌文件的具體描述,各參數含義同上--*/ name='UsersDBTest_log', filename='E:\DB\UsersDBTest_log.ldf', size=2mb, filegrowth=1mb ) use UsersDBTest -- 使用數據庫 -------------建立用戶、角色、權限表------------------ create table UserInfo ( ID int identity(1,1) not null, Uname nvarchar(max) not null, Pwd nvarchar(max) not null, ShowName nvarchar(max) null, ); create table RoleInfo ( ID int identity(1,1) not null, RoleName nvarchar(max) not null, ); create table ActionInfo ( ID int identity(1,1) not null, ActionName nvarchar(max) not null ); --------------建立關係表---------------- create table UserInfoRoleInfo ( UserInfo_ID int not null, RoleInfo_ID int not null ); create table RoleInfoActionInfo ( RoleInfo_ID int not null, ActionInfo_ID int not null ); --如何讓不擁有A角色的人擁有A角色的某個權限,讓擁有A角色全部權限的人失去某個權限
--A在程序判斷時設置優先級;B在程序判斷時設置且、或關係。 --跨角色受權或削權 create table R_UserInfo_ActionInfo ( ID int identity(1,1) not null, HasPermisson smallint not null, UserInfo_ID int not null, ActionInfo_ID int not null ); ---------------建立全部主鍵約束----------- Alter table UserInfo add constraint PK_UserInfo --給主鍵約束取別名,寓意:UserInfo表的主鍵約束。取別名的好處是1刪除方便2爲多個列定義同時約束,即主鍵組。 Primary Key Clustered(ID Asc); --主鍵約束 ,對ID列彙集索引,根據ID升序排序 Alter table RoleInfo add constraint PK_RoleInfo Primary Key Clustered(ID Asc); Alter table ActionInfo add constraint PK_ActionInfo Primary Key Clustered(ID Asc); Alter table UserInfoRoleInfo add constraint PK_UserInfoRoleInfo Primary Key Clustered(UserInfo_ID,RoleInfo_ID Asc); Alter table RoleInfoActionInfo add constraint PK_RoleInfoActionInfo Primary Key Clustered(RoleInfo_ID,ActionInfo_ID Asc); Alter table R_UserInfo_ActionInfo add constraint PK_R_UserInfo_ActionInfo Primary Key Clustered(ID Asc); --主鍵的簡單建立方式: --create table ActionInfo --( -- ID int identity(1,1) primary key not null, --方式1 -- ActionName nvarchar(max) not null, -- --primary key(ID) --方式2 --); --添加主鍵 -- alter table UserInfo add constraint PK_UserInfo primary key(ID,Uname) --主鍵組 --刪除主鍵: --Alter table UserInfo drop constraint PK_UserInfo --必須先刪除相關外鍵約束 ------------建立全部外鍵-------------------- Alter table UserInfoRoleInfo add constraint FK_UserInfoRoleInfo_UserInfo --給外鍵取別名 Foreign Key(UserInfo_ID) References UserInfo(ID) --讓外鍵表UserInfoRoleInfo的 UserInfo_ID列引用UserInfo表的ID列 On Delete no Action On Update no Action; --注意此處的Action不是ActionInfo表!!! Alter table UserInfoRoleInfo add constraint FK_UserInfoRoleInfo_RoleInfo --注意名稱不一樣 Foreign Key(RoleInfo_ID) References RoleInfo(ID) On Delete no Action On Update no Action; Alter table RoleInfoActionInfo add constraint FK_RoleInfoActionInfo_RoleInfo Foreign Key(RoleInfo_ID) References RoleInfo(ID) On Delete no Action On Update no Action; Alter table RoleInfoActionInfo add constraint FK_RoleInfoActionInfo_ActionInfo Foreign Key(ActionInfo_ID) References ActionInfo(ID) On Delete no Action On Update no Action; Alter table R_UserInfo_ActionInfo add constraint FK_UserInfoR_UserInfo_ActionInfo Foreign Key(UserInfo_ID) References UserInfo(ID) On Delete no Action On Update No Action; Alter table R_UserInfo_ActionInfo add constraint FK_ActionInfoR_UserInfo_ActionInfo Foreign Key(ActionInfo_ID) References ActionInfo(ID) On Delete no Action On Update No Action; --ON DELETE NO ACTION 指定若是試圖刪除某一行,而該行的鍵被其餘表的現有行中的外鍵所引用,則產生錯誤並回滾 DELETE 語句。 --ON UPDATE NO ACTION 指定若是試圖更新某一行中的鍵值,而該行的鍵被其餘表的現有行中的外鍵所引用,則產生錯誤並回滾 UPDATE 語句。 --外鍵(引用) --做用:保持數據一致性,完整性, --主要目的:控制存儲在外鍵表中的數據。 --使兩張表造成關聯,外鍵只能引用外表中的列的值或使用空值。 --1若是不使用外鍵,成績表的學號字段插入一個值(好比13341321), --可是這個值在學生表中並無,此時數據庫容許插入,並不會對插入的數據作關係檢查。 --問題是這樣極可能出現學生表和成績表不對應,在整合學生信息時出現遺漏或多餘等問題。 --2在設置外鍵的狀況下,你要插入成績表學號字段的值必需要求在學生表的學號字段能找到。 --你要刪除學生表的某個學號,必須保證成績表中沒有引用該值所在的列(外鍵),不然就無法刪除。 --這就是所謂的保持數據的一致性和完整性。 ------------建立索引------------------------ Create Index IX_FK_UserInfoRoleInfo_RoleInfo --給索引取名字 on UserInfoRoleInfo(RoleInfo_ID); --須要創建索引的列 Create Index IX_FK_RoleInfoActionInfo_ActionInfo on RoleInfoActionInfo(ActionInfo_ID); Create Index IX_FK_UserInfoR_UserInfo_ActionInfo on R_UserInfo_ActionInfo(UserInfo_ID); Create Index IX_FK_ActionInfoR_UserInfo_ActionInfo on R_UserInfo_ActionInfo(ActionInfo_ID); --外鍵是怎麼發揮做用的?把兩張表放一些數據增刪改看看.
來源:http://www.cnblogs.com/hao-1234-1234/p/6340778.htmlhtml
以上內容爲 應用程序權限設計(轉載!)第4種設計的Sql語句實現,爲了方便和減小失誤,建議使用數據庫設計工具PowerDesigner設計後自動生成Sql語句。sql