-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileServer_Create_DB.sql
More file actions
241 lines (174 loc) · 6.2 KB
/
FileServer_Create_DB.sql
File metadata and controls
241 lines (174 loc) · 6.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
-- DROP DATABASE FileServer1;
CREATE DATABASE FileServer1;
USE FileServer1;
-- -----------------------------------------------------
-- Пользователь и администратор
-- -----------------------------------------------------
CREATE TABLE `User` (
Id INT AUTO_INCREMENT PRIMARY KEY,
Surname VARCHAR(45) NOT NULL,
`Name` VARCHAR(45) NOT NULL,
Patronymic VARCHAR(45) NOT NULL,
Email VARCHAR(60) NOT NULL,
PasswordHash CHAR(60) NOT NULL,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE Administrator (
Id INT NOT NULL PRIMARY KEY,
FOREIGN KEY (Id) REFERENCES `User`(Id)
);
-- -----------------------------------------------------
-- Группа и её участники
-- -----------------------------------------------------
CREATE TABLE `Group` (
Id INT AUTO_INCREMENT PRIMARY KEY,
`Name` NVARCHAR(64) UNIQUE NOT NULL,
IdCreator INT NOT NULL,
FOREIGN KEY (IdCreator) REFERENCES `User`(Id)
);
CREATE TABLE GroupMember (
IdGroup INT NOT NULL,
IdUser INT NOT NULL,
PRIMARY KEY (IdGroup, IdUser),
FOREIGN KEY (IdGroup) REFERENCES `Group`(Id),
FOREIGN KEY (IdUser) REFERENCES `User`(Id)
);
-- -----------------------------------------------------
-- Файлы и папки (с флагом мягкого удаления)
-- -----------------------------------------------------
CREATE TABLE FileEntity (
Id BIGINT AUTO_INCREMENT PRIMARY KEY,
Path NVARCHAR(4096) NOT NULL UNIQUE,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
IsDeleted BOOLEAN NOT NULL DEFAULT FALSE,
INDEX path_index (Path(768))
);
CREATE TABLE FolderEntity (
Id BIGINT AUTO_INCREMENT PRIMARY KEY,
Path NVARCHAR(4096) NOT NULL UNIQUE,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
IsDeleted BOOLEAN NOT NULL DEFAULT FALSE,
INDEX path_index (Path(768))
);
-- -----------------------------------------------------
-- Удалённые версии
-- -----------------------------------------------------
CREATE TABLE DeletedFile (
Id BIGINT AUTO_INCREMENT PRIMARY KEY,
IdFileEntity BIGINT NOT NULL,
OriginalPath NVARCHAR(4096) NOT NULL,
IdDeletedByUser INT NOT NULL,
DeletedAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
Version INT NOT NULL DEFAULT 1 ,
FOREIGN KEY (IdFileEntity) REFERENCES FileEntity(Id),
FOREIGN KEY (IdDeletedByUser) REFERENCES `User`(Id),
INDEX idx_deleted_file (IdFileEntity, Version),
INDEX idx_deleted_by_user (IdDeletedByUser)
);
CREATE TABLE DeletedFolder (
Id BIGINT AUTO_INCREMENT PRIMARY KEY,
IdFolderEntity BIGINT NOT NULL,
OriginalPath NVARCHAR(4096) NOT NULL,
IdDeletedByUser INT NOT NULL,
DeletedAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
Version INT NOT NULL DEFAULT 1,
FOREIGN KEY (IdFolderEntity) REFERENCES FolderEntity(Id),
FOREIGN KEY (IdDeletedByUser) REFERENCES `User`(Id),
INDEX idx_deleted_folder (IdFolderEntity, Version)
);
-- -----------------------------------------------------
-- Права доступа
-- -----------------------------------------------------
CREATE TABLE FilePermission (
Id BIGINT AUTO_INCREMENT PRIMARY KEY,
IdFileEntity BIGINT NOT NULL,
IdUser INT NULL,
IdGroup INT NULL,
Mode SMALLINT UNSIGNED NOT NULL,
FOREIGN KEY (IdFileEntity) REFERENCES FileEntity(Id) ON DELETE CASCADE,
FOREIGN KEY (IdUser) REFERENCES `User`(Id) ON DELETE CASCADE,
FOREIGN KEY (IdGroup) REFERENCES `Group`(Id) ON DELETE CASCADE,
INDEX idx_file_user (IdFileEntity, IdUser),
INDEX idx_file_group (IdFileEntity, IdGroup),
CONSTRAINT permission_is_useful CHECK ((IdUser IS NOT NULL) != (IdGroup IS NOT NULL))
);
CREATE TABLE FolderPermission (
Id BIGINT AUTO_INCREMENT PRIMARY KEY,
IdFolderEntity BIGINT NOT NULL,
IdUser INT NULL,
IdGroup INT NULL,
Mode SMALLINT UNSIGNED NOT NULL,
FOREIGN KEY (IdFolderEntity) REFERENCES FolderEntity(Id) ON DELETE CASCADE,
FOREIGN KEY (IdUser) REFERENCES `User`(Id) ON DELETE CASCADE,
FOREIGN KEY (IdGroup) REFERENCES `Group`(Id) ON DELETE CASCADE,
INDEX idx_folder_user (IdFolderEntity, IdUser),
INDEX idx_folder_group (IdFolderEntity, IdGroup),
CONSTRAINT permission_is_useful CHECK ((IdUser IS NOT NULL) != (IdGroup IS NOT NULL))
);
-- -----------------------------------------------------
-- История работы (с сохранением пути и типа объекта)
-- -----------------------------------------------------
CREATE TABLE OperationType (
Id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
`Name` NVARCHAR(45) NOT NULL
);
CREATE TABLE WorkHistory (
Id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
WorkTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
IdOperationType INT NOT NULL,
IdUser INT NOT NULL,
IdFileEntity BIGINT NULL,
IdFolderEntity BIGINT NULL,
Path NVARCHAR(4096) NOT NULL,
IsFile BOOLEAN NOT NULL DEFAULT TRUE,
Details TEXT NULL,
FOREIGN KEY (IdOperationType) REFERENCES OperationType(Id),
FOREIGN KEY (IdUser) REFERENCES `User`(Id),
FOREIGN KEY (IdFileEntity) REFERENCES FileEntity(Id) ON DELETE SET NULL,
FOREIGN KEY (IdFolderEntity) REFERENCES FolderEntity(Id) ON DELETE SET NULL,
INDEX idx_history_user_time (IdUser, WorkTime),
INDEX idx_history_path (Path(768))
);
SHOW TABLES;
INSERT INTO OperationType (`Name`) VALUES
('CREATE'),
('READ'),
('UPDATE'),
('DELETE'),
('RESTORE'),
('CHANGE_PERMISSIONS'),
('MOVE'),
('RENAME'),
('DOWNLOAD'),
('UPLOAD');
SELECT * FROM OperationType;
DELIMITER //
CREATE PROCEDURE AddUser(
IN p_Surname VARCHAR(45),
IN p_Name VARCHAR(45),
IN p_Patronymic VARCHAR(45),
IN p_Email VARCHAR(60),
IN p_PasswordHash CHAR(60), -- BCrypt-хеш
IN p_IsAdmin BOOLEAN
)
BEGIN
DECLARE newUserId INT;
INSERT INTO `User` (Surname, `Name`, Patronymic, Email, PasswordHash, CreatedAt)
VALUES (p_Surname, p_Name, p_Patronymic, p_Email, p_PasswordHash, NOW());
SET newUserId = LAST_INSERT_ID();
IF p_IsAdmin THEN
INSERT INTO Administrator (Id) VALUES (newUserId);
END IF;
SELECT newUserId AS NewUserId;
END //
DELIMITER ;
CALL AddUser(
'Иванов',
'Артем',
'Сергеевич',
'Ivanov.AS@example.com',
'$2b$12$jD2Wp2GTzmZgQy.eFloEBeSPEsC1/uI8TR6aCQdzbHlJnXRlq4gHq', -- 123456a
TRUE
);
SELECT * FROM `User`;
SELECT * FROM Administrator;