Showing
10 changed files
with
1948 additions
and
2 deletions
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +SET DATABASE SQL SYNTAX PGS TRUE; | ||
18 | +SET DATABASE TRANSACTION CONTROL MVCC; | ||
19 | + | ||
20 | +CREATE TABLE IF NOT EXISTS admin_settings ( | ||
21 | + id uuid NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY, | ||
22 | + created_time bigint NOT NULL, | ||
23 | + json_value varchar, | ||
24 | + key varchar(255) | ||
25 | +); | ||
26 | + | ||
27 | +CREATE TABLE IF NOT EXISTS alarm ( | ||
28 | + id uuid NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY, | ||
29 | + created_time bigint NOT NULL, | ||
30 | + ack_ts bigint, | ||
31 | + clear_ts bigint, | ||
32 | + additional_info varchar, | ||
33 | + end_ts bigint, | ||
34 | + originator_id uuid, | ||
35 | + originator_type integer, | ||
36 | + propagate boolean, | ||
37 | + severity varchar(255), | ||
38 | + start_ts bigint, | ||
39 | + status varchar(255), | ||
40 | + tenant_id uuid, | ||
41 | + customer_id uuid, | ||
42 | + propagate_relation_types varchar, | ||
43 | + type varchar(255) | ||
44 | +); | ||
45 | + | ||
46 | +CREATE TABLE IF NOT EXISTS asset ( | ||
47 | + id uuid NOT NULL CONSTRAINT asset_pkey PRIMARY KEY, | ||
48 | + created_time bigint NOT NULL, | ||
49 | + additional_info varchar, | ||
50 | + customer_id uuid, | ||
51 | + name varchar(255), | ||
52 | + label varchar(255), | ||
53 | + search_text varchar(255), | ||
54 | + tenant_id uuid, | ||
55 | + type varchar(255), | ||
56 | + CONSTRAINT asset_name_unq_key UNIQUE (tenant_id, name) | ||
57 | +); | ||
58 | + | ||
59 | +CREATE TABLE IF NOT EXISTS audit_log ( | ||
60 | + id uuid NOT NULL CONSTRAINT audit_log_pkey PRIMARY KEY, | ||
61 | + created_time bigint NOT NULL, | ||
62 | + tenant_id uuid, | ||
63 | + customer_id uuid, | ||
64 | + entity_id uuid, | ||
65 | + entity_type varchar(255), | ||
66 | + entity_name varchar(255), | ||
67 | + user_id uuid, | ||
68 | + user_name varchar(255), | ||
69 | + action_type varchar(255), | ||
70 | + action_data varchar(1000000), | ||
71 | + action_status varchar(255), | ||
72 | + action_failure_details varchar(1000000) | ||
73 | +); | ||
74 | + | ||
75 | +CREATE TABLE IF NOT EXISTS attribute_kv ( | ||
76 | + entity_type varchar(255), | ||
77 | + entity_id uuid, | ||
78 | + attribute_type varchar(255), | ||
79 | + attribute_key varchar(255), | ||
80 | + bool_v boolean, | ||
81 | + str_v varchar(10000000), | ||
82 | + long_v bigint, | ||
83 | + dbl_v double precision, | ||
84 | + json_v varchar(10000000), | ||
85 | + last_update_ts bigint, | ||
86 | + CONSTRAINT attribute_kv_pkey PRIMARY KEY (entity_type, entity_id, attribute_type, attribute_key) | ||
87 | +); | ||
88 | + | ||
89 | +CREATE TABLE IF NOT EXISTS component_descriptor ( | ||
90 | + id uuid NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY, | ||
91 | + created_time bigint NOT NULL, | ||
92 | + actions varchar(255), | ||
93 | + clazz varchar UNIQUE, | ||
94 | + configuration_descriptor varchar, | ||
95 | + name varchar(255), | ||
96 | + scope varchar(255), | ||
97 | + search_text varchar(255), | ||
98 | + type varchar(255) | ||
99 | +); | ||
100 | + | ||
101 | +CREATE TABLE IF NOT EXISTS customer ( | ||
102 | + id uuid NOT NULL CONSTRAINT customer_pkey PRIMARY KEY, | ||
103 | + created_time bigint NOT NULL, | ||
104 | + additional_info varchar, | ||
105 | + address varchar, | ||
106 | + address2 varchar, | ||
107 | + city varchar(255), | ||
108 | + country varchar(255), | ||
109 | + email varchar(255), | ||
110 | + phone varchar(255), | ||
111 | + search_text varchar(255), | ||
112 | + state varchar(255), | ||
113 | + tenant_id uuid, | ||
114 | + title varchar(255), | ||
115 | + zip varchar(255) | ||
116 | +); | ||
117 | + | ||
118 | +CREATE TABLE IF NOT EXISTS dashboard ( | ||
119 | + id uuid NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY, | ||
120 | + created_time bigint NOT NULL, | ||
121 | + configuration varchar(10000000), | ||
122 | + assigned_customers varchar(1000000), | ||
123 | + search_text varchar(255), | ||
124 | + tenant_id uuid, | ||
125 | + title varchar(255), | ||
126 | + mobile_hide boolean DEFAULT false, | ||
127 | + mobile_order int, | ||
128 | + image varchar(1000000) | ||
129 | +); | ||
130 | + | ||
131 | +CREATE TABLE IF NOT EXISTS rule_chain ( | ||
132 | + id uuid NOT NULL CONSTRAINT rule_chain_pkey PRIMARY KEY, | ||
133 | + created_time bigint NOT NULL, | ||
134 | + additional_info varchar, | ||
135 | + configuration varchar(10000000), | ||
136 | + name varchar(255), | ||
137 | + type varchar(255), | ||
138 | + first_rule_node_id uuid, | ||
139 | + root boolean, | ||
140 | + debug_mode boolean, | ||
141 | + search_text varchar(255), | ||
142 | + tenant_id uuid | ||
143 | +); | ||
144 | + | ||
145 | +CREATE TABLE IF NOT EXISTS rule_node ( | ||
146 | + id uuid NOT NULL CONSTRAINT rule_node_pkey PRIMARY KEY, | ||
147 | + created_time bigint NOT NULL, | ||
148 | + rule_chain_id uuid, | ||
149 | + additional_info varchar, | ||
150 | + configuration varchar(10000000), | ||
151 | + type varchar(255), | ||
152 | + name varchar(255), | ||
153 | + debug_mode boolean, | ||
154 | + search_text varchar(255) | ||
155 | +); | ||
156 | + | ||
157 | +CREATE TABLE IF NOT EXISTS rule_node_state ( | ||
158 | + id uuid NOT NULL CONSTRAINT rule_node_state_pkey PRIMARY KEY, | ||
159 | + created_time bigint NOT NULL, | ||
160 | + rule_node_id uuid NOT NULL, | ||
161 | + entity_type varchar(32) NOT NULL, | ||
162 | + entity_id uuid NOT NULL, | ||
163 | + state_data varchar(16384) NOT NULL, | ||
164 | + CONSTRAINT rule_node_state_unq_key UNIQUE (rule_node_id, entity_id), | ||
165 | + CONSTRAINT fk_rule_node_state_node_id FOREIGN KEY (rule_node_id) REFERENCES rule_node(id) ON DELETE CASCADE | ||
166 | +); | ||
167 | + | ||
168 | +CREATE TABLE IF NOT EXISTS ota_package ( | ||
169 | + id uuid NOT NULL CONSTRAINT ota_package_pkey PRIMARY KEY, | ||
170 | + created_time bigint NOT NULL, | ||
171 | + tenant_id uuid NOT NULL, | ||
172 | + device_profile_id uuid , | ||
173 | + type varchar(32) NOT NULL, | ||
174 | + title varchar(255) NOT NULL, | ||
175 | + version varchar(255) NOT NULL, | ||
176 | + tag varchar(255), | ||
177 | + url varchar(255), | ||
178 | + file_name varchar(255), | ||
179 | + content_type varchar(255), | ||
180 | + checksum_algorithm varchar(32), | ||
181 | + checksum varchar(1020), | ||
182 | + data binary, | ||
183 | + data_size bigint, | ||
184 | + additional_info varchar, | ||
185 | + search_text varchar(255), | ||
186 | + CONSTRAINT ota_package_tenant_title_version_unq_key UNIQUE (tenant_id, title, version) | ||
187 | +); | ||
188 | + | ||
189 | +CREATE TABLE IF NOT EXISTS device_profile ( | ||
190 | + id uuid NOT NULL CONSTRAINT device_profile_pkey PRIMARY KEY, | ||
191 | + created_time bigint NOT NULL, | ||
192 | + name varchar(255), | ||
193 | + type varchar(255), | ||
194 | + image varchar(1000000), | ||
195 | + transport_type varchar(255), | ||
196 | + provision_type varchar(255), | ||
197 | + profile_data jsonb, | ||
198 | + description varchar, | ||
199 | + search_text varchar(255), | ||
200 | + is_default boolean, | ||
201 | + tenant_id uuid, | ||
202 | + firmware_id uuid, | ||
203 | + software_id uuid, | ||
204 | + default_rule_chain_id uuid, | ||
205 | + default_dashboard_id uuid, | ||
206 | + default_queue_name varchar(255), | ||
207 | + provision_device_key varchar, | ||
208 | + CONSTRAINT device_profile_name_unq_key UNIQUE (tenant_id, name), | ||
209 | + CONSTRAINT device_provision_key_unq_key UNIQUE (provision_device_key), | ||
210 | + CONSTRAINT fk_default_rule_chain_device_profile FOREIGN KEY (default_rule_chain_id) REFERENCES rule_chain(id), | ||
211 | + CONSTRAINT fk_default_dashboard_device_profile FOREIGN KEY (default_dashboard_id) REFERENCES dashboard(id), | ||
212 | + CONSTRAINT fk_firmware_device_profile FOREIGN KEY (firmware_id) REFERENCES ota_package(id), | ||
213 | + CONSTRAINT fk_software_device_profile FOREIGN KEY (software_id) REFERENCES ota_package(id) | ||
214 | +); | ||
215 | + | ||
216 | +CREATE TABLE IF NOT EXISTS device ( | ||
217 | + id uuid NOT NULL CONSTRAINT device_pkey PRIMARY KEY, | ||
218 | + created_time bigint NOT NULL, | ||
219 | + additional_info varchar, | ||
220 | + customer_id uuid, | ||
221 | + device_profile_id uuid NOT NULL, | ||
222 | + device_data jsonb, | ||
223 | + type varchar(255), | ||
224 | + name varchar(255), | ||
225 | + label varchar(255), | ||
226 | + search_text varchar(255), | ||
227 | + tenant_id uuid, | ||
228 | + firmware_id uuid, | ||
229 | + software_id uuid, | ||
230 | + CONSTRAINT device_name_unq_key UNIQUE (tenant_id, name), | ||
231 | + CONSTRAINT fk_device_profile FOREIGN KEY (device_profile_id) REFERENCES device_profile(id), | ||
232 | + CONSTRAINT fk_firmware_device FOREIGN KEY (firmware_id) REFERENCES ota_package(id), | ||
233 | + CONSTRAINT fk_software_device FOREIGN KEY (software_id) REFERENCES ota_package(id) | ||
234 | +); | ||
235 | + | ||
236 | +CREATE TABLE IF NOT EXISTS device_credentials ( | ||
237 | + id uuid NOT NULL CONSTRAINT device_credentials_pkey PRIMARY KEY, | ||
238 | + created_time bigint NOT NULL, | ||
239 | + credentials_id varchar, | ||
240 | + credentials_type varchar(255), | ||
241 | + credentials_value varchar, | ||
242 | + device_id uuid, | ||
243 | + CONSTRAINT device_credentials_id_unq_key UNIQUE (credentials_id), | ||
244 | + CONSTRAINT device_credentials_device_id_unq_key UNIQUE (device_id) | ||
245 | +); | ||
246 | + | ||
247 | +CREATE TABLE IF NOT EXISTS event ( | ||
248 | + id uuid NOT NULL CONSTRAINT event_pkey PRIMARY KEY, | ||
249 | + created_time bigint NOT NULL, | ||
250 | + body varchar(10000000), | ||
251 | + entity_id uuid, | ||
252 | + entity_type varchar(255), | ||
253 | + event_type varchar(255), | ||
254 | + event_uid varchar(255), | ||
255 | + tenant_id uuid, | ||
256 | + ts bigint NOT NULL, | ||
257 | + CONSTRAINT event_unq_key UNIQUE (tenant_id, entity_type, entity_id, event_type, event_uid) | ||
258 | +); | ||
259 | + | ||
260 | +CREATE TABLE IF NOT EXISTS relation ( | ||
261 | + from_id uuid, | ||
262 | + from_type varchar(255), | ||
263 | + to_id uuid, | ||
264 | + to_type varchar(255), | ||
265 | + relation_type_group varchar(255), | ||
266 | + relation_type varchar(255), | ||
267 | + additional_info varchar, | ||
268 | + CONSTRAINT relation_pkey PRIMARY KEY (from_id, from_type, relation_type_group, relation_type, to_id, to_type) | ||
269 | +); | ||
270 | + | ||
271 | +CREATE TABLE IF NOT EXISTS tb_user ( | ||
272 | + id uuid NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY, | ||
273 | + created_time bigint NOT NULL, | ||
274 | + additional_info varchar, | ||
275 | + authority varchar(255), | ||
276 | + customer_id uuid, | ||
277 | + email varchar(255) UNIQUE, | ||
278 | + first_name varchar(255), | ||
279 | + last_name varchar(255), | ||
280 | + search_text varchar(255), | ||
281 | + tenant_id uuid | ||
282 | +); | ||
283 | + | ||
284 | +CREATE TABLE IF NOT EXISTS tenant_profile ( | ||
285 | + id uuid NOT NULL CONSTRAINT tenant_profile_pkey PRIMARY KEY, | ||
286 | + created_time bigint NOT NULL, | ||
287 | + name varchar(255), | ||
288 | + profile_data jsonb, | ||
289 | + description varchar, | ||
290 | + search_text varchar(255), | ||
291 | + is_default boolean, | ||
292 | + isolated_tb_core boolean, | ||
293 | + isolated_tb_rule_engine boolean, | ||
294 | + CONSTRAINT tenant_profile_name_unq_key UNIQUE (name) | ||
295 | +); | ||
296 | + | ||
297 | +CREATE TABLE IF NOT EXISTS tenant ( | ||
298 | + id uuid NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY, | ||
299 | + created_time bigint NOT NULL, | ||
300 | + additional_info varchar, | ||
301 | + tenant_profile_id uuid NOT NULL, | ||
302 | + address varchar, | ||
303 | + address2 varchar, | ||
304 | + city varchar(255), | ||
305 | + country varchar(255), | ||
306 | + email varchar(255), | ||
307 | + phone varchar(255), | ||
308 | + region varchar(255), | ||
309 | + search_text varchar(255), | ||
310 | + state varchar(255), | ||
311 | + title varchar(255), | ||
312 | + zip varchar(255), | ||
313 | + CONSTRAINT fk_tenant_profile FOREIGN KEY (tenant_profile_id) REFERENCES tenant_profile(id) | ||
314 | +); | ||
315 | + | ||
316 | +CREATE TABLE IF NOT EXISTS user_credentials ( | ||
317 | + id uuid NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY, | ||
318 | + created_time bigint NOT NULL, | ||
319 | + activate_token varchar(255) UNIQUE, | ||
320 | + enabled boolean, | ||
321 | + password varchar(255), | ||
322 | + reset_token varchar(255) UNIQUE, | ||
323 | + user_id uuid UNIQUE | ||
324 | +); | ||
325 | + | ||
326 | +CREATE TABLE IF NOT EXISTS widget_type ( | ||
327 | + id uuid NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY, | ||
328 | + created_time bigint NOT NULL, | ||
329 | + alias varchar(255), | ||
330 | + bundle_alias varchar(255), | ||
331 | + descriptor varchar(1000000), | ||
332 | + name varchar(255), | ||
333 | + tenant_id uuid, | ||
334 | + image varchar(1000000), | ||
335 | + description varchar(255) | ||
336 | +); | ||
337 | + | ||
338 | +CREATE TABLE IF NOT EXISTS widgets_bundle ( | ||
339 | + id uuid NOT NULL CONSTRAINT widgets_bundle_pkey PRIMARY KEY, | ||
340 | + created_time bigint NOT NULL, | ||
341 | + alias varchar(255), | ||
342 | + search_text varchar(255), | ||
343 | + tenant_id uuid, | ||
344 | + title varchar(255), | ||
345 | + image varchar(1000000), | ||
346 | + description varchar(255) | ||
347 | +); | ||
348 | + | ||
349 | +CREATE TABLE IF NOT EXISTS entity_view ( | ||
350 | + id uuid NOT NULL CONSTRAINT entity_view_pkey PRIMARY KEY, | ||
351 | + created_time bigint NOT NULL, | ||
352 | + entity_id uuid, | ||
353 | + entity_type varchar(255), | ||
354 | + tenant_id uuid, | ||
355 | + customer_id uuid, | ||
356 | + type varchar(255), | ||
357 | + name varchar(255), | ||
358 | + keys varchar(10000000), | ||
359 | + start_ts bigint, | ||
360 | + end_ts bigint, | ||
361 | + search_text varchar(255), | ||
362 | + additional_info varchar | ||
363 | +); | ||
364 | + | ||
365 | +CREATE TABLE IF NOT EXISTS ts_kv_latest ( | ||
366 | + entity_id uuid NOT NULL, | ||
367 | + key int NOT NULL, | ||
368 | + ts bigint NOT NULL, | ||
369 | + bool_v boolean, | ||
370 | + str_v varchar(10000000), | ||
371 | + long_v bigint, | ||
372 | + dbl_v double precision, | ||
373 | + json_v varchar(10000000), | ||
374 | + CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key) | ||
375 | +); | ||
376 | + | ||
377 | +CREATE TABLE IF NOT EXISTS ts_kv_dictionary ( | ||
378 | + key varchar(255) NOT NULL, | ||
379 | + key_id int GENERATED BY DEFAULT AS IDENTITY(start with 0 increment by 1) UNIQUE, | ||
380 | + CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) | ||
381 | +); | ||
382 | + | ||
383 | +CREATE TABLE IF NOT EXISTS oauth2_params ( | ||
384 | + id uuid NOT NULL CONSTRAINT oauth2_params_pkey PRIMARY KEY, | ||
385 | + enabled boolean, | ||
386 | + tenant_id uuid, | ||
387 | + created_time bigint NOT NULL | ||
388 | +); | ||
389 | + | ||
390 | +CREATE TABLE IF NOT EXISTS oauth2_registration ( | ||
391 | + id uuid NOT NULL CONSTRAINT oauth2_registration_pkey PRIMARY KEY, | ||
392 | + oauth2_params_id uuid NOT NULL, | ||
393 | + created_time bigint NOT NULL, | ||
394 | + additional_info varchar, | ||
395 | + client_id varchar(255), | ||
396 | + client_secret varchar(2048), | ||
397 | + authorization_uri varchar(255), | ||
398 | + token_uri varchar(255), | ||
399 | + scope varchar(255), | ||
400 | + platforms varchar(255), | ||
401 | + user_info_uri varchar(255), | ||
402 | + user_name_attribute_name varchar(255), | ||
403 | + jwk_set_uri varchar(255), | ||
404 | + client_authentication_method varchar(255), | ||
405 | + login_button_label varchar(255), | ||
406 | + login_button_icon varchar(255), | ||
407 | + allow_user_creation boolean, | ||
408 | + activate_user boolean, | ||
409 | + type varchar(31), | ||
410 | + basic_email_attribute_key varchar(31), | ||
411 | + basic_first_name_attribute_key varchar(31), | ||
412 | + basic_last_name_attribute_key varchar(31), | ||
413 | + basic_tenant_name_strategy varchar(31), | ||
414 | + basic_tenant_name_pattern varchar(255), | ||
415 | + basic_customer_name_pattern varchar(255), | ||
416 | + basic_default_dashboard_name varchar(255), | ||
417 | + basic_always_full_screen boolean, | ||
418 | + custom_url varchar(255), | ||
419 | + custom_username varchar(255), | ||
420 | + custom_password varchar(255), | ||
421 | + custom_send_token boolean, | ||
422 | + CONSTRAINT fk_registration_oauth2_params FOREIGN KEY (oauth2_params_id) REFERENCES oauth2_params(id) ON DELETE CASCADE | ||
423 | +); | ||
424 | + | ||
425 | +CREATE TABLE IF NOT EXISTS oauth2_domain ( | ||
426 | + id uuid NOT NULL CONSTRAINT oauth2_domain_pkey PRIMARY KEY, | ||
427 | + oauth2_params_id uuid NOT NULL, | ||
428 | + created_time bigint NOT NULL, | ||
429 | + domain_name varchar(255), | ||
430 | + domain_scheme varchar(31), | ||
431 | + CONSTRAINT fk_domain_oauth2_params FOREIGN KEY (oauth2_params_id) REFERENCES oauth2_params(id) ON DELETE CASCADE, | ||
432 | + CONSTRAINT oauth2_domain_unq_key UNIQUE (oauth2_params_id, domain_name, domain_scheme) | ||
433 | +); | ||
434 | + | ||
435 | +CREATE TABLE IF NOT EXISTS oauth2_mobile ( | ||
436 | + id uuid NOT NULL CONSTRAINT oauth2_mobile_pkey PRIMARY KEY, | ||
437 | + oauth2_params_id uuid NOT NULL, | ||
438 | + created_time bigint NOT NULL, | ||
439 | + pkg_name varchar(255), | ||
440 | + app_secret varchar(2048), | ||
441 | + CONSTRAINT fk_mobile_oauth2_params FOREIGN KEY (oauth2_params_id) REFERENCES oauth2_params(id) ON DELETE CASCADE, | ||
442 | + CONSTRAINT oauth2_mobile_unq_key UNIQUE (oauth2_params_id, pkg_name) | ||
443 | +); | ||
444 | + | ||
445 | +CREATE TABLE IF NOT EXISTS oauth2_client_registration_template ( | ||
446 | + id uuid NOT NULL CONSTRAINT oauth2_client_registration_template_pkey PRIMARY KEY, | ||
447 | + created_time bigint NOT NULL, | ||
448 | + additional_info varchar, | ||
449 | + provider_id varchar(255), | ||
450 | + authorization_uri varchar(255), | ||
451 | + token_uri varchar(255), | ||
452 | + scope varchar(255), | ||
453 | + user_info_uri varchar(255), | ||
454 | + user_name_attribute_name varchar(255), | ||
455 | + jwk_set_uri varchar(255), | ||
456 | + client_authentication_method varchar(255), | ||
457 | + type varchar(31), | ||
458 | + basic_email_attribute_key varchar(31), | ||
459 | + basic_first_name_attribute_key varchar(31), | ||
460 | + basic_last_name_attribute_key varchar(31), | ||
461 | + basic_tenant_name_strategy varchar(31), | ||
462 | + basic_tenant_name_pattern varchar(255), | ||
463 | + basic_customer_name_pattern varchar(255), | ||
464 | + basic_default_dashboard_name varchar(255), | ||
465 | + basic_always_full_screen boolean, | ||
466 | + comment varchar, | ||
467 | + login_button_icon varchar(255), | ||
468 | + login_button_label varchar(255), | ||
469 | + help_link varchar(255), | ||
470 | + CONSTRAINT oauth2_template_provider_id_unq_key UNIQUE (provider_id) | ||
471 | +); | ||
472 | + | ||
473 | +-- Deprecated | ||
474 | +CREATE TABLE IF NOT EXISTS oauth2_client_registration_info ( | ||
475 | + id uuid NOT NULL CONSTRAINT oauth2_client_registration_info_pkey PRIMARY KEY, | ||
476 | + enabled boolean, | ||
477 | + created_time bigint NOT NULL, | ||
478 | + additional_info varchar, | ||
479 | + client_id varchar(255), | ||
480 | + client_secret varchar(255), | ||
481 | + authorization_uri varchar(255), | ||
482 | + token_uri varchar(255), | ||
483 | + scope varchar(255), | ||
484 | + user_info_uri varchar(255), | ||
485 | + user_name_attribute_name varchar(255), | ||
486 | + jwk_set_uri varchar(255), | ||
487 | + client_authentication_method varchar(255), | ||
488 | + login_button_label varchar(255), | ||
489 | + login_button_icon varchar(255), | ||
490 | + allow_user_creation boolean, | ||
491 | + activate_user boolean, | ||
492 | + type varchar(31), | ||
493 | + basic_email_attribute_key varchar(31), | ||
494 | + basic_first_name_attribute_key varchar(31), | ||
495 | + basic_last_name_attribute_key varchar(31), | ||
496 | + basic_tenant_name_strategy varchar(31), | ||
497 | + basic_tenant_name_pattern varchar(255), | ||
498 | + basic_customer_name_pattern varchar(255), | ||
499 | + basic_default_dashboard_name varchar(255), | ||
500 | + basic_always_full_screen boolean, | ||
501 | + custom_url varchar(255), | ||
502 | + custom_username varchar(255), | ||
503 | + custom_password varchar(255), | ||
504 | + custom_send_token boolean | ||
505 | +); | ||
506 | + | ||
507 | +-- Deprecated | ||
508 | +CREATE TABLE IF NOT EXISTS oauth2_client_registration ( | ||
509 | + id uuid NOT NULL CONSTRAINT oauth2_client_registration_pkey PRIMARY KEY, | ||
510 | + created_time bigint NOT NULL, | ||
511 | + domain_name varchar(255), | ||
512 | + domain_scheme varchar(31), | ||
513 | + client_registration_info_id uuid | ||
514 | +); | ||
515 | + | ||
516 | +CREATE TABLE IF NOT EXISTS api_usage_state ( | ||
517 | + id uuid NOT NULL CONSTRAINT usage_record_pkey PRIMARY KEY, | ||
518 | + created_time bigint NOT NULL, | ||
519 | + tenant_id uuid, | ||
520 | + entity_type varchar(32), | ||
521 | + entity_id uuid, | ||
522 | + transport varchar(32), | ||
523 | + db_storage varchar(32), | ||
524 | + re_exec varchar(32), | ||
525 | + js_exec varchar(32), | ||
526 | + email_exec varchar(32), | ||
527 | + sms_exec varchar(32), | ||
528 | + alarm_exec varchar(32), | ||
529 | + CONSTRAINT api_usage_state_unq_key UNIQUE (tenant_id, entity_id) | ||
530 | +); | ||
531 | + | ||
532 | +CREATE TABLE IF NOT EXISTS resource ( | ||
533 | + id uuid NOT NULL CONSTRAINT resource_pkey PRIMARY KEY, | ||
534 | + created_time bigint NOT NULL, | ||
535 | + tenant_id uuid NOT NULL, | ||
536 | + title varchar(255) NOT NULL, | ||
537 | + resource_type varchar(32) NOT NULL, | ||
538 | + resource_key varchar(255) NOT NULL, | ||
539 | + search_text varchar(255), | ||
540 | + file_name varchar(255) NOT NULL, | ||
541 | + data varchar, | ||
542 | + CONSTRAINT resource_unq_key UNIQUE (tenant_id, resource_type, resource_key) | ||
543 | +); | ||
544 | + | ||
545 | +CREATE TABLE IF NOT EXISTS edge ( | ||
546 | + id uuid NOT NULL CONSTRAINT edge_pkey PRIMARY KEY, | ||
547 | + created_time bigint NOT NULL, | ||
548 | + additional_info varchar, | ||
549 | + customer_id uuid, | ||
550 | + root_rule_chain_id uuid, | ||
551 | + type varchar(255), | ||
552 | + name varchar(255), | ||
553 | + label varchar(255), | ||
554 | + routing_key varchar(255), | ||
555 | + secret varchar(255), | ||
556 | + edge_license_key varchar(30), | ||
557 | + cloud_endpoint varchar(255), | ||
558 | + search_text varchar(255), | ||
559 | + tenant_id uuid, | ||
560 | + CONSTRAINT edge_name_unq_key UNIQUE (tenant_id, name), | ||
561 | + CONSTRAINT edge_routing_key_unq_key UNIQUE (routing_key) | ||
562 | +); | ||
563 | + | ||
564 | +CREATE TABLE IF NOT EXISTS edge_event ( | ||
565 | + id uuid NOT NULL CONSTRAINT edge_event_pkey PRIMARY KEY, | ||
566 | + created_time bigint NOT NULL, | ||
567 | + edge_id uuid, | ||
568 | + edge_event_type varchar(255), | ||
569 | + edge_event_uid varchar(255), | ||
570 | + entity_id uuid, | ||
571 | + edge_event_action varchar(255), | ||
572 | + body varchar(10000000), | ||
573 | + tenant_id uuid, | ||
574 | + ts bigint NOT NULL | ||
575 | +); | ||
576 | + | ||
577 | +CREATE TABLE IF NOT EXISTS rpc ( | ||
578 | + id uuid NOT NULL CONSTRAINT rpc_pkey PRIMARY KEY, | ||
579 | + created_time bigint NOT NULL, | ||
580 | + tenant_id uuid NOT NULL, | ||
581 | + device_id uuid NOT NULL, | ||
582 | + expiration_time bigint NOT NULL, | ||
583 | + request varchar(10000000) NOT NULL, | ||
584 | + response varchar(10000000), | ||
585 | + additional_info varchar(10000000), | ||
586 | + status varchar(255) NOT NULL | ||
587 | +); |
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +-- This file describes PostgreSQL-specific indexes that not supported by hsql | ||
18 | +-- It is not a stand-alone file! Run schema-entities-idx.sql before! | ||
19 | +-- Note: Hibernate DESC order translates to native SQL "ORDER BY .. DESC NULLS LAST" | ||
20 | +-- While creating index PostgreSQL transforms short notation (ts DESC) to the full (DESC NULLS FIRST) | ||
21 | +-- That difference between NULLS LAST and NULLS FIRST prevents to hit index while querying latest by ts | ||
22 | +-- That why we need to define DESC index explicitly as (ts DESC NULLS LAST) | ||
23 | + | ||
24 | +CREATE INDEX IF NOT EXISTS idx_event_ts | ||
25 | + ON public.event | ||
26 | + (ts DESC NULLS LAST) | ||
27 | + WITH (FILLFACTOR=95); | ||
28 | + | ||
29 | +COMMENT ON INDEX public.idx_event_ts | ||
30 | + IS 'This index helps to delete events by TTL using timestamp'; | ||
31 | + | ||
32 | +CREATE INDEX IF NOT EXISTS idx_event_tenant_entity_type_entity_event_type_created_time_des | ||
33 | + ON public.event | ||
34 | + (tenant_id ASC, entity_type ASC, entity_id ASC, event_type ASC, created_time DESC NULLS LAST) | ||
35 | + WITH (FILLFACTOR=95); | ||
36 | + | ||
37 | +COMMENT ON INDEX public.idx_event_tenant_entity_type_entity_event_type_created_time_des | ||
38 | + IS 'This index helps to open latest events on UI fast'; |
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +CREATE INDEX IF NOT EXISTS idx_alarm_originator_alarm_type ON alarm(originator_id, type, start_ts DESC); | ||
18 | + | ||
19 | +CREATE INDEX IF NOT EXISTS idx_alarm_originator_created_time ON alarm(originator_id, created_time DESC); | ||
20 | + | ||
21 | +CREATE INDEX IF NOT EXISTS idx_alarm_tenant_created_time ON alarm(tenant_id, created_time DESC); | ||
22 | + | ||
23 | +CREATE INDEX IF NOT EXISTS idx_alarm_tenant_alarm_type_created_time ON alarm(tenant_id, type, created_time DESC); | ||
24 | + | ||
25 | +CREATE INDEX IF NOT EXISTS idx_relation_to_id ON relation(relation_type_group, to_type, to_id); | ||
26 | + | ||
27 | +CREATE INDEX IF NOT EXISTS idx_relation_from_id ON relation(relation_type_group, from_type, from_id); | ||
28 | + | ||
29 | +CREATE INDEX IF NOT EXISTS idx_device_customer_id ON device(tenant_id, customer_id); | ||
30 | + | ||
31 | +CREATE INDEX IF NOT EXISTS idx_device_customer_id_and_type ON device(tenant_id, customer_id, type); | ||
32 | + | ||
33 | +CREATE INDEX IF NOT EXISTS idx_device_type ON device(tenant_id, type); | ||
34 | + | ||
35 | +CREATE INDEX IF NOT EXISTS idx_device_device_profile_id ON device(tenant_id, device_profile_id); | ||
36 | + | ||
37 | +CREATE INDEX IF NOT EXISTS idx_asset_customer_id ON asset(tenant_id, customer_id); | ||
38 | + | ||
39 | +CREATE INDEX IF NOT EXISTS idx_asset_customer_id_and_type ON asset(tenant_id, customer_id, type); | ||
40 | + | ||
41 | +CREATE INDEX IF NOT EXISTS idx_asset_type ON asset(tenant_id, type); | ||
42 | + | ||
43 | +CREATE INDEX IF NOT EXISTS idx_attribute_kv_by_key_and_last_update_ts ON attribute_kv(entity_id, attribute_key, last_update_ts desc); | ||
44 | + | ||
45 | +CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time); | ||
46 | + | ||
47 | +CREATE INDEX IF NOT EXISTS idx_rpc_tenant_id_device_id ON rpc(tenant_id, device_id); |
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +CREATE TABLE IF NOT EXISTS tb_schema_settings | ||
18 | +( | ||
19 | + schema_version bigint NOT NULL, | ||
20 | + CONSTRAINT tb_schema_settings_pkey PRIMARY KEY (schema_version) | ||
21 | +); | ||
22 | + | ||
23 | +CREATE OR REPLACE PROCEDURE insert_tb_schema_settings() | ||
24 | + LANGUAGE plpgsql AS | ||
25 | +$$ | ||
26 | +BEGIN | ||
27 | + IF (SELECT COUNT(*) FROM tb_schema_settings) = 0 THEN | ||
28 | + INSERT INTO tb_schema_settings (schema_version) VALUES (3003000); | ||
29 | + END IF; | ||
30 | +END; | ||
31 | +$$; | ||
32 | + | ||
33 | +call insert_tb_schema_settings(); | ||
34 | + | ||
35 | +CREATE TABLE IF NOT EXISTS admin_settings ( | ||
36 | + id uuid NOT NULL CONSTRAINT admin_settings_pkey PRIMARY KEY, | ||
37 | + created_time bigint NOT NULL, | ||
38 | + json_value varchar, | ||
39 | + key varchar(255) | ||
40 | +); | ||
41 | + | ||
42 | +CREATE TABLE IF NOT EXISTS alarm ( | ||
43 | + id uuid NOT NULL CONSTRAINT alarm_pkey PRIMARY KEY, | ||
44 | + created_time bigint NOT NULL, | ||
45 | + ack_ts bigint, | ||
46 | + clear_ts bigint, | ||
47 | + additional_info varchar, | ||
48 | + end_ts bigint, | ||
49 | + originator_id uuid, | ||
50 | + originator_type integer, | ||
51 | + propagate boolean, | ||
52 | + severity varchar(255), | ||
53 | + start_ts bigint, | ||
54 | + status varchar(255), | ||
55 | + tenant_id uuid, | ||
56 | + customer_id uuid, | ||
57 | + propagate_relation_types varchar, | ||
58 | + type varchar(255) | ||
59 | +); | ||
60 | + | ||
61 | +CREATE TABLE IF NOT EXISTS asset ( | ||
62 | + id uuid NOT NULL CONSTRAINT asset_pkey PRIMARY KEY, | ||
63 | + created_time bigint NOT NULL, | ||
64 | + additional_info varchar, | ||
65 | + customer_id uuid, | ||
66 | + name varchar(255), | ||
67 | + label varchar(255), | ||
68 | + search_text varchar(255), | ||
69 | + tenant_id uuid, | ||
70 | + type varchar(255), | ||
71 | + CONSTRAINT asset_name_unq_key UNIQUE (tenant_id, name) | ||
72 | +); | ||
73 | + | ||
74 | +CREATE TABLE IF NOT EXISTS audit_log ( | ||
75 | + id uuid NOT NULL CONSTRAINT audit_log_pkey PRIMARY KEY, | ||
76 | + created_time bigint NOT NULL, | ||
77 | + tenant_id uuid, | ||
78 | + customer_id uuid, | ||
79 | + entity_id uuid, | ||
80 | + entity_type varchar(255), | ||
81 | + entity_name varchar(255), | ||
82 | + user_id uuid, | ||
83 | + user_name varchar(255), | ||
84 | + action_type varchar(255), | ||
85 | + action_data varchar(1000000), | ||
86 | + action_status varchar(255), | ||
87 | + action_failure_details varchar(1000000) | ||
88 | +); | ||
89 | + | ||
90 | +CREATE TABLE IF NOT EXISTS attribute_kv ( | ||
91 | + entity_type varchar(255), | ||
92 | + entity_id uuid, | ||
93 | + attribute_type varchar(255), | ||
94 | + attribute_key varchar(255), | ||
95 | + bool_v boolean, | ||
96 | + str_v varchar(10000000), | ||
97 | + long_v bigint, | ||
98 | + dbl_v double precision, | ||
99 | + json_v json, | ||
100 | + last_update_ts bigint, | ||
101 | + CONSTRAINT attribute_kv_pkey PRIMARY KEY (entity_type, entity_id, attribute_type, attribute_key) | ||
102 | +); | ||
103 | + | ||
104 | +CREATE TABLE IF NOT EXISTS component_descriptor ( | ||
105 | + id uuid NOT NULL CONSTRAINT component_descriptor_pkey PRIMARY KEY, | ||
106 | + created_time bigint NOT NULL, | ||
107 | + actions varchar(255), | ||
108 | + clazz varchar UNIQUE, | ||
109 | + configuration_descriptor varchar, | ||
110 | + name varchar(255), | ||
111 | + scope varchar(255), | ||
112 | + search_text varchar(255), | ||
113 | + type varchar(255) | ||
114 | +); | ||
115 | + | ||
116 | +CREATE TABLE IF NOT EXISTS customer ( | ||
117 | + id uuid NOT NULL CONSTRAINT customer_pkey PRIMARY KEY, | ||
118 | + created_time bigint NOT NULL, | ||
119 | + additional_info varchar, | ||
120 | + address varchar, | ||
121 | + address2 varchar, | ||
122 | + city varchar(255), | ||
123 | + country varchar(255), | ||
124 | + email varchar(255), | ||
125 | + phone varchar(255), | ||
126 | + search_text varchar(255), | ||
127 | + state varchar(255), | ||
128 | + tenant_id uuid, | ||
129 | + title varchar(255), | ||
130 | + zip varchar(255) | ||
131 | +); | ||
132 | + | ||
133 | +CREATE TABLE IF NOT EXISTS dashboard ( | ||
134 | + id uuid NOT NULL CONSTRAINT dashboard_pkey PRIMARY KEY, | ||
135 | + created_time bigint NOT NULL, | ||
136 | + configuration varchar, | ||
137 | + assigned_customers varchar(1000000), | ||
138 | + search_text varchar(255), | ||
139 | + tenant_id uuid, | ||
140 | + title varchar(255), | ||
141 | + mobile_hide boolean DEFAULT false, | ||
142 | + mobile_order int, | ||
143 | + image varchar(1000000) | ||
144 | +); | ||
145 | + | ||
146 | +CREATE TABLE IF NOT EXISTS rule_chain ( | ||
147 | + id uuid NOT NULL CONSTRAINT rule_chain_pkey PRIMARY KEY, | ||
148 | + created_time bigint NOT NULL, | ||
149 | + additional_info varchar, | ||
150 | + configuration varchar(10000000), | ||
151 | + name varchar(255), | ||
152 | + type varchar(255), | ||
153 | + first_rule_node_id uuid, | ||
154 | + root boolean, | ||
155 | + debug_mode boolean, | ||
156 | + search_text varchar(255), | ||
157 | + tenant_id uuid | ||
158 | +); | ||
159 | + | ||
160 | +CREATE TABLE IF NOT EXISTS rule_node ( | ||
161 | + id uuid NOT NULL CONSTRAINT rule_node_pkey PRIMARY KEY, | ||
162 | + created_time bigint NOT NULL, | ||
163 | + rule_chain_id uuid, | ||
164 | + additional_info varchar, | ||
165 | + configuration varchar(10000000), | ||
166 | + type varchar(255), | ||
167 | + name varchar(255), | ||
168 | + debug_mode boolean, | ||
169 | + search_text varchar(255) | ||
170 | +); | ||
171 | + | ||
172 | +CREATE TABLE IF NOT EXISTS rule_node_state ( | ||
173 | + id uuid NOT NULL CONSTRAINT rule_node_state_pkey PRIMARY KEY, | ||
174 | + created_time bigint NOT NULL, | ||
175 | + rule_node_id uuid NOT NULL, | ||
176 | + entity_type varchar(32) NOT NULL, | ||
177 | + entity_id uuid NOT NULL, | ||
178 | + state_data varchar(16384) NOT NULL, | ||
179 | + CONSTRAINT rule_node_state_unq_key UNIQUE (rule_node_id, entity_id), | ||
180 | + CONSTRAINT fk_rule_node_state_node_id FOREIGN KEY (rule_node_id) REFERENCES rule_node(id) ON DELETE CASCADE | ||
181 | +); | ||
182 | + | ||
183 | +CREATE TABLE IF NOT EXISTS ota_package ( | ||
184 | + id uuid NOT NULL CONSTRAINT ota_package_pkey PRIMARY KEY, | ||
185 | + created_time bigint NOT NULL, | ||
186 | + tenant_id uuid NOT NULL, | ||
187 | + device_profile_id uuid , | ||
188 | + type varchar(32) NOT NULL, | ||
189 | + title varchar(255) NOT NULL, | ||
190 | + version varchar(255) NOT NULL, | ||
191 | + tag varchar(255), | ||
192 | + url varchar(255), | ||
193 | + file_name varchar(255), | ||
194 | + content_type varchar(255), | ||
195 | + checksum_algorithm varchar(32), | ||
196 | + checksum varchar(1020), | ||
197 | + data oid, | ||
198 | + data_size bigint, | ||
199 | + additional_info varchar, | ||
200 | + search_text varchar(255), | ||
201 | + CONSTRAINT ota_package_tenant_title_version_unq_key UNIQUE (tenant_id, title, version) | ||
202 | +-- CONSTRAINT fk_device_profile_firmware FOREIGN KEY (device_profile_id) REFERENCES device_profile(id) ON DELETE CASCADE | ||
203 | +); | ||
204 | + | ||
205 | +CREATE TABLE IF NOT EXISTS device_profile ( | ||
206 | + id uuid NOT NULL CONSTRAINT device_profile_pkey PRIMARY KEY, | ||
207 | + created_time bigint NOT NULL, | ||
208 | + name varchar(255), | ||
209 | + type varchar(255), | ||
210 | + image varchar(1000000), | ||
211 | + transport_type varchar(255), | ||
212 | + provision_type varchar(255), | ||
213 | + profile_data jsonb, | ||
214 | + description varchar, | ||
215 | + search_text varchar(255), | ||
216 | + is_default boolean, | ||
217 | + tenant_id uuid, | ||
218 | + firmware_id uuid, | ||
219 | + software_id uuid, | ||
220 | + default_rule_chain_id uuid, | ||
221 | + default_dashboard_id uuid, | ||
222 | + default_queue_name varchar(255), | ||
223 | + provision_device_key varchar, | ||
224 | + CONSTRAINT device_profile_name_unq_key UNIQUE (tenant_id, name), | ||
225 | + CONSTRAINT device_provision_key_unq_key UNIQUE (provision_device_key), | ||
226 | + CONSTRAINT fk_default_rule_chain_device_profile FOREIGN KEY (default_rule_chain_id) REFERENCES rule_chain(id), | ||
227 | + CONSTRAINT fk_default_dashboard_device_profile FOREIGN KEY (default_dashboard_id) REFERENCES dashboard(id), | ||
228 | + CONSTRAINT fk_firmware_device_profile FOREIGN KEY (firmware_id) REFERENCES ota_package(id), | ||
229 | + CONSTRAINT fk_software_device_profile FOREIGN KEY (software_id) REFERENCES ota_package(id) | ||
230 | +); | ||
231 | + | ||
232 | +-- We will use one-to-many relation in the first release and extend this feature in case of user requests | ||
233 | +-- CREATE TABLE IF NOT EXISTS device_profile_firmware ( | ||
234 | +-- device_profile_id uuid NOT NULL, | ||
235 | +-- firmware_id uuid NOT NULL, | ||
236 | +-- CONSTRAINT device_profile_firmware_unq_key UNIQUE (device_profile_id, firmware_id), | ||
237 | +-- CONSTRAINT fk_device_profile_firmware_device_profile FOREIGN KEY (device_profile_id) REFERENCES device_profile(id) ON DELETE CASCADE, | ||
238 | +-- CONSTRAINT fk_device_profile_firmware_firmware FOREIGN KEY (firmware_id) REFERENCES firmware(id) ON DELETE CASCADE, | ||
239 | +-- ); | ||
240 | + | ||
241 | +CREATE TABLE IF NOT EXISTS device ( | ||
242 | + id uuid NOT NULL CONSTRAINT device_pkey PRIMARY KEY, | ||
243 | + created_time bigint NOT NULL, | ||
244 | + additional_info varchar, | ||
245 | + customer_id uuid, | ||
246 | + device_profile_id uuid NOT NULL, | ||
247 | + device_data jsonb, | ||
248 | + type varchar(255), | ||
249 | + name varchar(255), | ||
250 | + label varchar(255), | ||
251 | + search_text varchar(255), | ||
252 | + tenant_id uuid, | ||
253 | + firmware_id uuid, | ||
254 | + software_id uuid, | ||
255 | + CONSTRAINT device_name_unq_key UNIQUE (tenant_id, name), | ||
256 | + CONSTRAINT fk_device_profile FOREIGN KEY (device_profile_id) REFERENCES device_profile(id), | ||
257 | + CONSTRAINT fk_firmware_device FOREIGN KEY (firmware_id) REFERENCES ota_package(id), | ||
258 | + CONSTRAINT fk_software_device FOREIGN KEY (software_id) REFERENCES ota_package(id) | ||
259 | +); | ||
260 | + | ||
261 | +CREATE TABLE IF NOT EXISTS device_credentials ( | ||
262 | + id uuid NOT NULL CONSTRAINT device_credentials_pkey PRIMARY KEY, | ||
263 | + created_time bigint NOT NULL, | ||
264 | + credentials_id varchar, | ||
265 | + credentials_type varchar(255), | ||
266 | + credentials_value varchar, | ||
267 | + device_id uuid, | ||
268 | + CONSTRAINT device_credentials_id_unq_key UNIQUE (credentials_id), | ||
269 | + CONSTRAINT device_credentials_device_id_unq_key UNIQUE (device_id) | ||
270 | +); | ||
271 | + | ||
272 | +CREATE TABLE IF NOT EXISTS event ( | ||
273 | + id uuid NOT NULL CONSTRAINT event_pkey PRIMARY KEY, | ||
274 | + created_time bigint NOT NULL, | ||
275 | + body varchar(10000000), | ||
276 | + entity_id uuid, | ||
277 | + entity_type varchar(255), | ||
278 | + event_type varchar(255), | ||
279 | + event_uid varchar(255), | ||
280 | + tenant_id uuid, | ||
281 | + ts bigint NOT NULL, | ||
282 | + CONSTRAINT event_unq_key UNIQUE (tenant_id, entity_type, entity_id, event_type, event_uid) | ||
283 | +); | ||
284 | + | ||
285 | +CREATE TABLE IF NOT EXISTS relation ( | ||
286 | + from_id uuid, | ||
287 | + from_type varchar(255), | ||
288 | + to_id uuid, | ||
289 | + to_type varchar(255), | ||
290 | + relation_type_group varchar(255), | ||
291 | + relation_type varchar(255), | ||
292 | + additional_info varchar, | ||
293 | + CONSTRAINT relation_pkey PRIMARY KEY (from_id, from_type, relation_type_group, relation_type, to_id, to_type) | ||
294 | +); | ||
295 | +-- ) PARTITION BY LIST (relation_type_group); | ||
296 | +-- | ||
297 | +-- CREATE TABLE other_relations PARTITION OF relation DEFAULT; | ||
298 | +-- CREATE TABLE common_relations PARTITION OF relation FOR VALUES IN ('COMMON'); | ||
299 | +-- CREATE TABLE alarm_relations PARTITION OF relation FOR VALUES IN ('ALARM'); | ||
300 | +-- CREATE TABLE dashboard_relations PARTITION OF relation FOR VALUES IN ('DASHBOARD'); | ||
301 | +-- CREATE TABLE rule_relations PARTITION OF relation FOR VALUES IN ('RULE_CHAIN', 'RULE_NODE'); | ||
302 | + | ||
303 | +CREATE TABLE IF NOT EXISTS tb_user ( | ||
304 | + id uuid NOT NULL CONSTRAINT tb_user_pkey PRIMARY KEY, | ||
305 | + created_time bigint NOT NULL, | ||
306 | + additional_info varchar, | ||
307 | + authority varchar(255), | ||
308 | + customer_id uuid, | ||
309 | + email varchar(255) UNIQUE, | ||
310 | + first_name varchar(255), | ||
311 | + last_name varchar(255), | ||
312 | + search_text varchar(255), | ||
313 | + tenant_id uuid | ||
314 | +); | ||
315 | + | ||
316 | +CREATE TABLE IF NOT EXISTS tenant_profile ( | ||
317 | + id uuid NOT NULL CONSTRAINT tenant_profile_pkey PRIMARY KEY, | ||
318 | + created_time bigint NOT NULL, | ||
319 | + name varchar(255), | ||
320 | + profile_data jsonb, | ||
321 | + description varchar, | ||
322 | + search_text varchar(255), | ||
323 | + is_default boolean, | ||
324 | + isolated_tb_core boolean, | ||
325 | + isolated_tb_rule_engine boolean, | ||
326 | + CONSTRAINT tenant_profile_name_unq_key UNIQUE (name) | ||
327 | +); | ||
328 | + | ||
329 | +CREATE TABLE IF NOT EXISTS tenant ( | ||
330 | + id uuid NOT NULL CONSTRAINT tenant_pkey PRIMARY KEY, | ||
331 | + created_time bigint NOT NULL, | ||
332 | + additional_info varchar, | ||
333 | + tenant_profile_id uuid NOT NULL, | ||
334 | + address varchar, | ||
335 | + address2 varchar, | ||
336 | + city varchar(255), | ||
337 | + country varchar(255), | ||
338 | + email varchar(255), | ||
339 | + phone varchar(255), | ||
340 | + region varchar(255), | ||
341 | + search_text varchar(255), | ||
342 | + state varchar(255), | ||
343 | + title varchar(255), | ||
344 | + zip varchar(255), | ||
345 | + CONSTRAINT fk_tenant_profile FOREIGN KEY (tenant_profile_id) REFERENCES tenant_profile(id) | ||
346 | +); | ||
347 | + | ||
348 | +CREATE TABLE IF NOT EXISTS user_credentials ( | ||
349 | + id uuid NOT NULL CONSTRAINT user_credentials_pkey PRIMARY KEY, | ||
350 | + created_time bigint NOT NULL, | ||
351 | + activate_token varchar(255) UNIQUE, | ||
352 | + enabled boolean, | ||
353 | + password varchar(255), | ||
354 | + reset_token varchar(255) UNIQUE, | ||
355 | + user_id uuid UNIQUE | ||
356 | +); | ||
357 | + | ||
358 | +CREATE TABLE IF NOT EXISTS widget_type ( | ||
359 | + id uuid NOT NULL CONSTRAINT widget_type_pkey PRIMARY KEY, | ||
360 | + created_time bigint NOT NULL, | ||
361 | + alias varchar(255), | ||
362 | + bundle_alias varchar(255), | ||
363 | + descriptor varchar(1000000), | ||
364 | + name varchar(255), | ||
365 | + tenant_id uuid, | ||
366 | + image varchar(1000000), | ||
367 | + description varchar(255) | ||
368 | +); | ||
369 | + | ||
370 | +CREATE TABLE IF NOT EXISTS widgets_bundle ( | ||
371 | + id uuid NOT NULL CONSTRAINT widgets_bundle_pkey PRIMARY KEY, | ||
372 | + created_time bigint NOT NULL, | ||
373 | + alias varchar(255), | ||
374 | + search_text varchar(255), | ||
375 | + tenant_id uuid, | ||
376 | + title varchar(255), | ||
377 | + image varchar(1000000), | ||
378 | + description varchar(255) | ||
379 | +); | ||
380 | + | ||
381 | +CREATE TABLE IF NOT EXISTS entity_view ( | ||
382 | + id uuid NOT NULL CONSTRAINT entity_view_pkey PRIMARY KEY, | ||
383 | + created_time bigint NOT NULL, | ||
384 | + entity_id uuid, | ||
385 | + entity_type varchar(255), | ||
386 | + tenant_id uuid, | ||
387 | + customer_id uuid, | ||
388 | + type varchar(255), | ||
389 | + name varchar(255), | ||
390 | + keys varchar(10000000), | ||
391 | + start_ts bigint, | ||
392 | + end_ts bigint, | ||
393 | + search_text varchar(255), | ||
394 | + additional_info varchar | ||
395 | +); | ||
396 | + | ||
397 | +CREATE TABLE IF NOT EXISTS ts_kv_latest | ||
398 | +( | ||
399 | + entity_id uuid NOT NULL, | ||
400 | + key int NOT NULL, | ||
401 | + ts bigint NOT NULL, | ||
402 | + bool_v boolean, | ||
403 | + str_v varchar(10000000), | ||
404 | + long_v bigint, | ||
405 | + dbl_v double precision, | ||
406 | + json_v json, | ||
407 | + CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key) | ||
408 | +); | ||
409 | + | ||
410 | +CREATE TABLE IF NOT EXISTS ts_kv_dictionary | ||
411 | +( | ||
412 | + key varchar(255) NOT NULL, | ||
413 | + key_id serial UNIQUE, | ||
414 | + CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) | ||
415 | +); | ||
416 | + | ||
417 | +CREATE TABLE IF NOT EXISTS oauth2_params ( | ||
418 | + id uuid NOT NULL CONSTRAINT oauth2_params_pkey PRIMARY KEY, | ||
419 | + enabled boolean, | ||
420 | + tenant_id uuid, | ||
421 | + created_time bigint NOT NULL | ||
422 | +); | ||
423 | + | ||
424 | +CREATE TABLE IF NOT EXISTS oauth2_registration ( | ||
425 | + id uuid NOT NULL CONSTRAINT oauth2_registration_pkey PRIMARY KEY, | ||
426 | + oauth2_params_id uuid NOT NULL, | ||
427 | + created_time bigint NOT NULL, | ||
428 | + additional_info varchar, | ||
429 | + client_id varchar(255), | ||
430 | + client_secret varchar(2048), | ||
431 | + authorization_uri varchar(255), | ||
432 | + token_uri varchar(255), | ||
433 | + scope varchar(255), | ||
434 | + platforms varchar(255), | ||
435 | + user_info_uri varchar(255), | ||
436 | + user_name_attribute_name varchar(255), | ||
437 | + jwk_set_uri varchar(255), | ||
438 | + client_authentication_method varchar(255), | ||
439 | + login_button_label varchar(255), | ||
440 | + login_button_icon varchar(255), | ||
441 | + allow_user_creation boolean, | ||
442 | + activate_user boolean, | ||
443 | + type varchar(31), | ||
444 | + basic_email_attribute_key varchar(31), | ||
445 | + basic_first_name_attribute_key varchar(31), | ||
446 | + basic_last_name_attribute_key varchar(31), | ||
447 | + basic_tenant_name_strategy varchar(31), | ||
448 | + basic_tenant_name_pattern varchar(255), | ||
449 | + basic_customer_name_pattern varchar(255), | ||
450 | + basic_default_dashboard_name varchar(255), | ||
451 | + basic_always_full_screen boolean, | ||
452 | + custom_url varchar(255), | ||
453 | + custom_username varchar(255), | ||
454 | + custom_password varchar(255), | ||
455 | + custom_send_token boolean, | ||
456 | + CONSTRAINT fk_registration_oauth2_params FOREIGN KEY (oauth2_params_id) REFERENCES oauth2_params(id) ON DELETE CASCADE | ||
457 | +); | ||
458 | + | ||
459 | +CREATE TABLE IF NOT EXISTS oauth2_domain ( | ||
460 | + id uuid NOT NULL CONSTRAINT oauth2_domain_pkey PRIMARY KEY, | ||
461 | + oauth2_params_id uuid NOT NULL, | ||
462 | + created_time bigint NOT NULL, | ||
463 | + domain_name varchar(255), | ||
464 | + domain_scheme varchar(31), | ||
465 | + CONSTRAINT fk_domain_oauth2_params FOREIGN KEY (oauth2_params_id) REFERENCES oauth2_params(id) ON DELETE CASCADE, | ||
466 | + CONSTRAINT oauth2_domain_unq_key UNIQUE (oauth2_params_id, domain_name, domain_scheme) | ||
467 | +); | ||
468 | + | ||
469 | +CREATE TABLE IF NOT EXISTS oauth2_mobile ( | ||
470 | + id uuid NOT NULL CONSTRAINT oauth2_mobile_pkey PRIMARY KEY, | ||
471 | + oauth2_params_id uuid NOT NULL, | ||
472 | + created_time bigint NOT NULL, | ||
473 | + pkg_name varchar(255), | ||
474 | + app_secret varchar(2048), | ||
475 | + CONSTRAINT fk_mobile_oauth2_params FOREIGN KEY (oauth2_params_id) REFERENCES oauth2_params(id) ON DELETE CASCADE, | ||
476 | + CONSTRAINT oauth2_mobile_unq_key UNIQUE (oauth2_params_id, pkg_name) | ||
477 | +); | ||
478 | + | ||
479 | +CREATE TABLE IF NOT EXISTS oauth2_client_registration_template ( | ||
480 | + id uuid NOT NULL CONSTRAINT oauth2_client_registration_template_pkey PRIMARY KEY, | ||
481 | + created_time bigint NOT NULL, | ||
482 | + additional_info varchar, | ||
483 | + provider_id varchar(255), | ||
484 | + authorization_uri varchar(255), | ||
485 | + token_uri varchar(255), | ||
486 | + scope varchar(255), | ||
487 | + user_info_uri varchar(255), | ||
488 | + user_name_attribute_name varchar(255), | ||
489 | + jwk_set_uri varchar(255), | ||
490 | + client_authentication_method varchar(255), | ||
491 | + type varchar(31), | ||
492 | + basic_email_attribute_key varchar(31), | ||
493 | + basic_first_name_attribute_key varchar(31), | ||
494 | + basic_last_name_attribute_key varchar(31), | ||
495 | + basic_tenant_name_strategy varchar(31), | ||
496 | + basic_tenant_name_pattern varchar(255), | ||
497 | + basic_customer_name_pattern varchar(255), | ||
498 | + basic_default_dashboard_name varchar(255), | ||
499 | + basic_always_full_screen boolean, | ||
500 | + comment varchar, | ||
501 | + login_button_icon varchar(255), | ||
502 | + login_button_label varchar(255), | ||
503 | + help_link varchar(255), | ||
504 | + CONSTRAINT oauth2_template_provider_id_unq_key UNIQUE (provider_id) | ||
505 | +); | ||
506 | + | ||
507 | +-- Deprecated | ||
508 | +CREATE TABLE IF NOT EXISTS oauth2_client_registration_info ( | ||
509 | + id uuid NOT NULL CONSTRAINT oauth2_client_registration_info_pkey PRIMARY KEY, | ||
510 | + enabled boolean, | ||
511 | + created_time bigint NOT NULL, | ||
512 | + additional_info varchar, | ||
513 | + client_id varchar(255), | ||
514 | + client_secret varchar(255), | ||
515 | + authorization_uri varchar(255), | ||
516 | + token_uri varchar(255), | ||
517 | + scope varchar(255), | ||
518 | + user_info_uri varchar(255), | ||
519 | + user_name_attribute_name varchar(255), | ||
520 | + jwk_set_uri varchar(255), | ||
521 | + client_authentication_method varchar(255), | ||
522 | + login_button_label varchar(255), | ||
523 | + login_button_icon varchar(255), | ||
524 | + allow_user_creation boolean, | ||
525 | + activate_user boolean, | ||
526 | + type varchar(31), | ||
527 | + basic_email_attribute_key varchar(31), | ||
528 | + basic_first_name_attribute_key varchar(31), | ||
529 | + basic_last_name_attribute_key varchar(31), | ||
530 | + basic_tenant_name_strategy varchar(31), | ||
531 | + basic_tenant_name_pattern varchar(255), | ||
532 | + basic_customer_name_pattern varchar(255), | ||
533 | + basic_default_dashboard_name varchar(255), | ||
534 | + basic_always_full_screen boolean, | ||
535 | + custom_url varchar(255), | ||
536 | + custom_username varchar(255), | ||
537 | + custom_password varchar(255), | ||
538 | + custom_send_token boolean | ||
539 | +); | ||
540 | + | ||
541 | +-- Deprecated | ||
542 | +CREATE TABLE IF NOT EXISTS oauth2_client_registration ( | ||
543 | + id uuid NOT NULL CONSTRAINT oauth2_client_registration_pkey PRIMARY KEY, | ||
544 | + created_time bigint NOT NULL, | ||
545 | + domain_name varchar(255), | ||
546 | + domain_scheme varchar(31), | ||
547 | + client_registration_info_id uuid | ||
548 | +); | ||
549 | + | ||
550 | +CREATE TABLE IF NOT EXISTS api_usage_state ( | ||
551 | + id uuid NOT NULL CONSTRAINT usage_record_pkey PRIMARY KEY, | ||
552 | + created_time bigint NOT NULL, | ||
553 | + tenant_id uuid, | ||
554 | + entity_type varchar(32), | ||
555 | + entity_id uuid, | ||
556 | + transport varchar(32), | ||
557 | + db_storage varchar(32), | ||
558 | + re_exec varchar(32), | ||
559 | + js_exec varchar(32), | ||
560 | + email_exec varchar(32), | ||
561 | + sms_exec varchar(32), | ||
562 | + alarm_exec varchar(32), | ||
563 | + CONSTRAINT api_usage_state_unq_key UNIQUE (tenant_id, entity_id) | ||
564 | +); | ||
565 | + | ||
566 | +CREATE TABLE IF NOT EXISTS resource ( | ||
567 | + id uuid NOT NULL CONSTRAINT resource_pkey PRIMARY KEY, | ||
568 | + created_time bigint NOT NULL, | ||
569 | + tenant_id uuid NOT NULL, | ||
570 | + title varchar(255) NOT NULL, | ||
571 | + resource_type varchar(32) NOT NULL, | ||
572 | + resource_key varchar(255) NOT NULL, | ||
573 | + search_text varchar(255), | ||
574 | + file_name varchar(255) NOT NULL, | ||
575 | + data varchar, | ||
576 | + CONSTRAINT resource_unq_key UNIQUE (tenant_id, resource_type, resource_key) | ||
577 | +); | ||
578 | + | ||
579 | +CREATE TABLE IF NOT EXISTS edge ( | ||
580 | + id uuid NOT NULL CONSTRAINT edge_pkey PRIMARY KEY, | ||
581 | + created_time bigint NOT NULL, | ||
582 | + additional_info varchar, | ||
583 | + customer_id uuid, | ||
584 | + root_rule_chain_id uuid, | ||
585 | + type varchar(255), | ||
586 | + name varchar(255), | ||
587 | + label varchar(255), | ||
588 | + routing_key varchar(255), | ||
589 | + secret varchar(255), | ||
590 | + edge_license_key varchar(30), | ||
591 | + cloud_endpoint varchar(255), | ||
592 | + search_text varchar(255), | ||
593 | + tenant_id uuid, | ||
594 | + CONSTRAINT edge_name_unq_key UNIQUE (tenant_id, name), | ||
595 | + CONSTRAINT edge_routing_key_unq_key UNIQUE (routing_key) | ||
596 | +); | ||
597 | + | ||
598 | +CREATE TABLE IF NOT EXISTS edge_event ( | ||
599 | + id uuid NOT NULL CONSTRAINT edge_event_pkey PRIMARY KEY, | ||
600 | + created_time bigint NOT NULL, | ||
601 | + edge_id uuid, | ||
602 | + edge_event_type varchar(255), | ||
603 | + edge_event_uid varchar(255), | ||
604 | + entity_id uuid, | ||
605 | + edge_event_action varchar(255), | ||
606 | + body varchar(10000000), | ||
607 | + tenant_id uuid, | ||
608 | + ts bigint NOT NULL | ||
609 | +); | ||
610 | + | ||
611 | +CREATE TABLE IF NOT EXISTS rpc ( | ||
612 | + id uuid NOT NULL CONSTRAINT rpc_pkey PRIMARY KEY, | ||
613 | + created_time bigint NOT NULL, | ||
614 | + tenant_id uuid NOT NULL, | ||
615 | + device_id uuid NOT NULL, | ||
616 | + expiration_time bigint NOT NULL, | ||
617 | + request varchar(10000000) NOT NULL, | ||
618 | + response varchar(10000000), | ||
619 | + additional_info varchar(10000000), | ||
620 | + status varchar(255) NOT NULL | ||
621 | +); | ||
622 | + | ||
623 | +CREATE OR REPLACE PROCEDURE cleanup_events_by_ttl(IN ttl bigint, IN debug_ttl bigint, INOUT deleted bigint) | ||
624 | + LANGUAGE plpgsql AS | ||
625 | +$$ | ||
626 | +DECLARE | ||
627 | + ttl_ts bigint; | ||
628 | + debug_ttl_ts bigint; | ||
629 | + ttl_deleted_count bigint DEFAULT 0; | ||
630 | + debug_ttl_deleted_count bigint DEFAULT 0; | ||
631 | +BEGIN | ||
632 | + IF ttl > 0 THEN | ||
633 | + ttl_ts := (EXTRACT(EPOCH FROM current_timestamp) * 1000 - ttl::bigint * 1000)::bigint; | ||
634 | + EXECUTE format( | ||
635 | + 'WITH deleted AS (DELETE FROM event WHERE ts < %L::bigint AND (event_type != %L::varchar AND event_type != %L::varchar) RETURNING *) SELECT count(*) FROM deleted', ttl_ts, 'DEBUG_RULE_NODE', 'DEBUG_RULE_CHAIN') into ttl_deleted_count; | ||
636 | + END IF; | ||
637 | + IF debug_ttl > 0 THEN | ||
638 | + debug_ttl_ts := (EXTRACT(EPOCH FROM current_timestamp) * 1000 - debug_ttl::bigint * 1000)::bigint; | ||
639 | + EXECUTE format( | ||
640 | + 'WITH deleted AS (DELETE FROM event WHERE ts < %L::bigint AND (event_type = %L::varchar OR event_type = %L::varchar) RETURNING *) SELECT count(*) FROM deleted', debug_ttl_ts, 'DEBUG_RULE_NODE', 'DEBUG_RULE_CHAIN') into debug_ttl_deleted_count; | ||
641 | + END IF; | ||
642 | + RAISE NOTICE 'Events removed by ttl: %', ttl_deleted_count; | ||
643 | + RAISE NOTICE 'Debug Events removed by ttl: %', debug_ttl_deleted_count; | ||
644 | + deleted := ttl_deleted_count + debug_ttl_deleted_count; | ||
645 | +END | ||
646 | +$$; | ||
647 | + | ||
648 | +CREATE OR REPLACE FUNCTION to_uuid(IN entity_id varchar, OUT uuid_id uuid) AS | ||
649 | +$$ | ||
650 | +BEGIN | ||
651 | + uuid_id := substring(entity_id, 8, 8) || '-' || substring(entity_id, 4, 4) || '-1' || substring(entity_id, 1, 3) || | ||
652 | + '-' || substring(entity_id, 16, 4) || '-' || substring(entity_id, 20, 12); | ||
653 | +END; | ||
654 | +$$ LANGUAGE plpgsql; | ||
655 | + | ||
656 | + | ||
657 | +CREATE OR REPLACE PROCEDURE cleanup_edge_events_by_ttl(IN ttl bigint, INOUT deleted bigint) | ||
658 | + LANGUAGE plpgsql AS | ||
659 | +$$ | ||
660 | +DECLARE | ||
661 | + ttl_ts bigint; | ||
662 | + ttl_deleted_count bigint DEFAULT 0; | ||
663 | +BEGIN | ||
664 | + IF ttl > 0 THEN | ||
665 | + ttl_ts := (EXTRACT(EPOCH FROM current_timestamp) * 1000 - ttl::bigint * 1000)::bigint; | ||
666 | + EXECUTE format( | ||
667 | + 'WITH deleted AS (DELETE FROM edge_event WHERE ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', ttl_ts) into ttl_deleted_count; | ||
668 | + END IF; | ||
669 | + RAISE NOTICE 'Edge events removed by ttl: %', ttl_deleted_count; | ||
670 | + deleted := ttl_deleted_count; | ||
671 | +END | ||
672 | +$$; |
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; | ||
18 | + | ||
19 | +CREATE TABLE IF NOT EXISTS ts_kv ( | ||
20 | + entity_id uuid NOT NULL, | ||
21 | + key int NOT NULL, | ||
22 | + ts bigint NOT NULL, | ||
23 | + bool_v boolean, | ||
24 | + str_v varchar(10000000), | ||
25 | + long_v bigint, | ||
26 | + dbl_v double precision, | ||
27 | + json_v json, | ||
28 | + CONSTRAINT ts_kv_pkey PRIMARY KEY (entity_id, key, ts) | ||
29 | +); | ||
30 | + | ||
31 | +CREATE TABLE IF NOT EXISTS ts_kv_dictionary ( | ||
32 | + key varchar(255) NOT NULL, | ||
33 | + key_id serial UNIQUE, | ||
34 | + CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) | ||
35 | +); | ||
36 | + | ||
37 | +CREATE TABLE IF NOT EXISTS ts_kv_latest ( | ||
38 | + entity_id uuid NOT NULL, | ||
39 | + key int NOT NULL, | ||
40 | + ts bigint NOT NULL, | ||
41 | + bool_v boolean, | ||
42 | + str_v varchar(10000000), | ||
43 | + long_v bigint, | ||
44 | + dbl_v double precision, | ||
45 | + json_v json, | ||
46 | + CONSTRAINT ts_kv_latest_pkey PRIMARY KEY (entity_id, key) | ||
47 | +); | ||
48 | + | ||
49 | +CREATE OR REPLACE FUNCTION to_uuid(IN entity_id varchar, OUT uuid_id uuid) AS | ||
50 | +$$ | ||
51 | +BEGIN | ||
52 | + uuid_id := substring(entity_id, 8, 8) || '-' || substring(entity_id, 4, 4) || '-1' || substring(entity_id, 1, 3) || | ||
53 | + '-' || substring(entity_id, 16, 4) || '-' || substring(entity_id, 20, 12); | ||
54 | +END; | ||
55 | +$$ LANGUAGE plpgsql; | ||
56 | + | ||
57 | +CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | ||
58 | + OUT deleted bigint) AS | ||
59 | +$$ | ||
60 | +BEGIN | ||
61 | + EXECUTE format( | ||
62 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT device.id as entity_id FROM device WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | ||
63 | + tenant_id, customer_id, ttl) into deleted; | ||
64 | +END; | ||
65 | +$$ LANGUAGE plpgsql; | ||
66 | + | ||
67 | +CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | ||
68 | + OUT deleted bigint) AS | ||
69 | +$$ | ||
70 | +BEGIN | ||
71 | + EXECUTE format( | ||
72 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT asset.id as entity_id FROM asset WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | ||
73 | + tenant_id, customer_id, ttl) into deleted; | ||
74 | +END; | ||
75 | +$$ LANGUAGE plpgsql; | ||
76 | + | ||
77 | +CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | ||
78 | + OUT deleted bigint) AS | ||
79 | +$$ | ||
80 | +BEGIN | ||
81 | + EXECUTE format( | ||
82 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT customer.id as entity_id FROM customer WHERE tenant_id = %L and id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | ||
83 | + tenant_id, customer_id, ttl) into deleted; | ||
84 | +END; | ||
85 | +$$ LANGUAGE plpgsql; | ||
86 | + | ||
87 | +CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid uuid, | ||
88 | + IN system_ttl bigint, INOUT deleted bigint) | ||
89 | + LANGUAGE plpgsql AS | ||
90 | +$$ | ||
91 | +DECLARE | ||
92 | + tenant_cursor CURSOR FOR select tenant.id as tenant_id | ||
93 | + from tenant; | ||
94 | + tenant_id_record uuid; | ||
95 | + customer_id_record uuid; | ||
96 | + tenant_ttl bigint; | ||
97 | + customer_ttl bigint; | ||
98 | + deleted_for_entities bigint; | ||
99 | + tenant_ttl_ts bigint; | ||
100 | + customer_ttl_ts bigint; | ||
101 | +BEGIN | ||
102 | + OPEN tenant_cursor; | ||
103 | + FETCH tenant_cursor INTO tenant_id_record; | ||
104 | + WHILE FOUND | ||
105 | + LOOP | ||
106 | + EXECUTE format( | ||
107 | + 'select attribute_kv.long_v from attribute_kv where attribute_kv.entity_id = %L and attribute_kv.attribute_key = %L', | ||
108 | + tenant_id_record, 'TTL') INTO tenant_ttl; | ||
109 | + if tenant_ttl IS NULL THEN | ||
110 | + tenant_ttl := system_ttl; | ||
111 | + END IF; | ||
112 | + IF tenant_ttl > 0 THEN | ||
113 | + tenant_ttl_ts := (EXTRACT(EPOCH FROM current_timestamp) * 1000 - tenant_ttl::bigint * 1000)::bigint; | ||
114 | + deleted_for_entities := delete_device_records_from_ts_kv(tenant_id_record, null_uuid, tenant_ttl_ts); | ||
115 | + deleted := deleted + deleted_for_entities; | ||
116 | + RAISE NOTICE '% telemetry removed for devices where tenant_id = %', deleted_for_entities, tenant_id_record; | ||
117 | + deleted_for_entities := delete_asset_records_from_ts_kv(tenant_id_record, null_uuid, tenant_ttl_ts); | ||
118 | + deleted := deleted + deleted_for_entities; | ||
119 | + RAISE NOTICE '% telemetry removed for assets where tenant_id = %', deleted_for_entities, tenant_id_record; | ||
120 | + END IF; | ||
121 | + FOR customer_id_record IN | ||
122 | + SELECT customer.id AS customer_id FROM customer WHERE customer.tenant_id = tenant_id_record | ||
123 | + LOOP | ||
124 | + EXECUTE format( | ||
125 | + 'select attribute_kv.long_v from attribute_kv where attribute_kv.entity_id = %L and attribute_kv.attribute_key = %L', | ||
126 | + customer_id_record, 'TTL') INTO customer_ttl; | ||
127 | + IF customer_ttl IS NULL THEN | ||
128 | + customer_ttl_ts := tenant_ttl_ts; | ||
129 | + ELSE | ||
130 | + IF customer_ttl > 0 THEN | ||
131 | + customer_ttl_ts := | ||
132 | + (EXTRACT(EPOCH FROM current_timestamp) * 1000 - | ||
133 | + customer_ttl::bigint * 1000)::bigint; | ||
134 | + END IF; | ||
135 | + END IF; | ||
136 | + IF customer_ttl_ts IS NOT NULL AND customer_ttl_ts > 0 THEN | ||
137 | + deleted_for_entities := | ||
138 | + delete_customer_records_from_ts_kv(tenant_id_record, customer_id_record, | ||
139 | + customer_ttl_ts); | ||
140 | + deleted := deleted + deleted_for_entities; | ||
141 | + RAISE NOTICE '% telemetry removed for customer with id = % where tenant_id = %', deleted_for_entities, customer_id_record, tenant_id_record; | ||
142 | + deleted_for_entities := | ||
143 | + delete_device_records_from_ts_kv(tenant_id_record, customer_id_record, | ||
144 | + customer_ttl_ts); | ||
145 | + deleted := deleted + deleted_for_entities; | ||
146 | + RAISE NOTICE '% telemetry removed for devices where tenant_id = % and customer_id = %', deleted_for_entities, tenant_id_record, customer_id_record; | ||
147 | + deleted_for_entities := delete_asset_records_from_ts_kv(tenant_id_record, | ||
148 | + customer_id_record, | ||
149 | + customer_ttl_ts); | ||
150 | + deleted := deleted + deleted_for_entities; | ||
151 | + RAISE NOTICE '% telemetry removed for assets where tenant_id = % and customer_id = %', deleted_for_entities, tenant_id_record, customer_id_record; | ||
152 | + END IF; | ||
153 | + END LOOP; | ||
154 | + FETCH tenant_cursor INTO tenant_id_record; | ||
155 | + END LOOP; | ||
156 | +END | ||
157 | +$$; |
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +SET DATABASE SQL SYNTAX PGS TRUE; | ||
18 | +SET DATABASE TRANSACTION CONTROL MVCC; | ||
19 | + | ||
20 | +CREATE TABLE IF NOT EXISTS ts_kv ( | ||
21 | + entity_id uuid NOT NULL, | ||
22 | + key int NOT NULL, | ||
23 | + ts bigint NOT NULL, | ||
24 | + bool_v boolean, | ||
25 | + str_v varchar(10000000), | ||
26 | + long_v bigint, | ||
27 | + dbl_v double precision, | ||
28 | + json_v varchar(10000000), | ||
29 | + CONSTRAINT ts_kv_pkey PRIMARY KEY (entity_id, key, ts) | ||
30 | +); | ||
31 | + | ||
32 | +CREATE TABLE IF NOT EXISTS ts_kv_dictionary ( | ||
33 | + key varchar(255) NOT NULL, | ||
34 | + key_id int GENERATED BY DEFAULT AS IDENTITY(start with 0 increment by 1) UNIQUE, | ||
35 | + CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) | ||
36 | +); | ||
37 | + | ||
38 | +CREATE FUNCTION to_uuid(IN entity_id varchar) | ||
39 | + RETURNS UUID | ||
40 | + RETURN UUID(substring(entity_id, 8, 8) || '-' || substring(entity_id, 4, 4) || '-1' || substring(entity_id, 1, 3) || | ||
41 | + '-' || substring(entity_id, 16, 4) || '-' || substring(entity_id, 20, 12)); |
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +CREATE TABLE IF NOT EXISTS ts_kv | ||
18 | +( | ||
19 | + entity_id uuid NOT NULL, | ||
20 | + key int NOT NULL, | ||
21 | + ts bigint NOT NULL, | ||
22 | + bool_v boolean, | ||
23 | + str_v varchar(10000000), | ||
24 | + long_v bigint, | ||
25 | + dbl_v double precision, | ||
26 | + json_v json, | ||
27 | + CONSTRAINT ts_kv_pkey PRIMARY KEY (entity_id, key, ts) | ||
28 | +) PARTITION BY RANGE (ts); | ||
29 | + | ||
30 | +CREATE TABLE IF NOT EXISTS ts_kv_dictionary | ||
31 | +( | ||
32 | + key varchar(255) NOT NULL, | ||
33 | + key_id serial UNIQUE, | ||
34 | + CONSTRAINT ts_key_id_pkey PRIMARY KEY (key) | ||
35 | +); | ||
36 | + | ||
37 | +CREATE OR REPLACE PROCEDURE drop_partitions_by_max_ttl(IN partition_type varchar, IN system_ttl bigint, INOUT deleted bigint) | ||
38 | + LANGUAGE plpgsql AS | ||
39 | +$$ | ||
40 | +DECLARE | ||
41 | + max_tenant_ttl bigint; | ||
42 | + max_customer_ttl bigint; | ||
43 | + max_ttl bigint; | ||
44 | + date timestamp; | ||
45 | + partition_by_max_ttl_date varchar; | ||
46 | + partition_by_max_ttl_month varchar; | ||
47 | + partition_by_max_ttl_day varchar; | ||
48 | + partition_by_max_ttl_year varchar; | ||
49 | + partition varchar; | ||
50 | + partition_year integer; | ||
51 | + partition_month integer; | ||
52 | + partition_day integer; | ||
53 | + | ||
54 | +BEGIN | ||
55 | + SELECT max(attribute_kv.long_v) | ||
56 | + FROM tenant | ||
57 | + INNER JOIN attribute_kv ON tenant.id = attribute_kv.entity_id | ||
58 | + WHERE attribute_kv.attribute_key = 'TTL' | ||
59 | + into max_tenant_ttl; | ||
60 | + SELECT max(attribute_kv.long_v) | ||
61 | + FROM customer | ||
62 | + INNER JOIN attribute_kv ON customer.id = attribute_kv.entity_id | ||
63 | + WHERE attribute_kv.attribute_key = 'TTL' | ||
64 | + into max_customer_ttl; | ||
65 | + max_ttl := GREATEST(system_ttl, max_customer_ttl, max_tenant_ttl); | ||
66 | + if max_ttl IS NOT NULL AND max_ttl > 0 THEN | ||
67 | + date := to_timestamp(EXTRACT(EPOCH FROM current_timestamp) - max_ttl); | ||
68 | + partition_by_max_ttl_date := get_partition_by_max_ttl_date(partition_type, date); | ||
69 | + RAISE NOTICE 'Date by max ttl: %', date; | ||
70 | + RAISE NOTICE 'Partition by max ttl: %', partition_by_max_ttl_date; | ||
71 | + IF partition_by_max_ttl_date IS NOT NULL THEN | ||
72 | + CASE | ||
73 | + WHEN partition_type = 'DAYS' THEN | ||
74 | + partition_by_max_ttl_year := SPLIT_PART(partition_by_max_ttl_date, '_', 3); | ||
75 | + partition_by_max_ttl_month := SPLIT_PART(partition_by_max_ttl_date, '_', 4); | ||
76 | + partition_by_max_ttl_day := SPLIT_PART(partition_by_max_ttl_date, '_', 5); | ||
77 | + WHEN partition_type = 'MONTHS' THEN | ||
78 | + partition_by_max_ttl_year := SPLIT_PART(partition_by_max_ttl_date, '_', 3); | ||
79 | + partition_by_max_ttl_month := SPLIT_PART(partition_by_max_ttl_date, '_', 4); | ||
80 | + ELSE | ||
81 | + partition_by_max_ttl_year := SPLIT_PART(partition_by_max_ttl_date, '_', 3); | ||
82 | + END CASE; | ||
83 | + IF partition_by_max_ttl_year IS NULL THEN | ||
84 | + RAISE NOTICE 'Failed to remove partitions by max ttl date due to partition_by_max_ttl_year is null!'; | ||
85 | + ELSE | ||
86 | + IF partition_type = 'YEARS' THEN | ||
87 | + FOR partition IN SELECT tablename | ||
88 | + FROM pg_tables | ||
89 | + WHERE schemaname = 'public' | ||
90 | + AND tablename like 'ts_kv_' || '%' | ||
91 | + AND tablename != 'ts_kv_latest' | ||
92 | + AND tablename != 'ts_kv_dictionary' | ||
93 | + AND tablename != 'ts_kv_indefinite' | ||
94 | + AND tablename != partition_by_max_ttl_date | ||
95 | + LOOP | ||
96 | + partition_year := SPLIT_PART(partition, '_', 3)::integer; | ||
97 | + IF partition_year < partition_by_max_ttl_year::integer THEN | ||
98 | + RAISE NOTICE 'Partition to delete by max ttl: %', partition; | ||
99 | + EXECUTE format('DROP TABLE IF EXISTS %I', partition); | ||
100 | + deleted := deleted + 1; | ||
101 | + END IF; | ||
102 | + END LOOP; | ||
103 | + ELSE | ||
104 | + IF partition_type = 'MONTHS' THEN | ||
105 | + IF partition_by_max_ttl_month IS NULL THEN | ||
106 | + RAISE NOTICE 'Failed to remove months partitions by max ttl date due to partition_by_max_ttl_month is null!'; | ||
107 | + ELSE | ||
108 | + FOR partition IN SELECT tablename | ||
109 | + FROM pg_tables | ||
110 | + WHERE schemaname = 'public' | ||
111 | + AND tablename like 'ts_kv_' || '%' | ||
112 | + AND tablename != 'ts_kv_latest' | ||
113 | + AND tablename != 'ts_kv_dictionary' | ||
114 | + AND tablename != 'ts_kv_indefinite' | ||
115 | + AND tablename != partition_by_max_ttl_date | ||
116 | + LOOP | ||
117 | + partition_year := SPLIT_PART(partition, '_', 3)::integer; | ||
118 | + IF partition_year > partition_by_max_ttl_year::integer THEN | ||
119 | + RAISE NOTICE 'Skip iteration! Partition: % is valid!', partition; | ||
120 | + CONTINUE; | ||
121 | + ELSE | ||
122 | + IF partition_year < partition_by_max_ttl_year::integer THEN | ||
123 | + RAISE NOTICE 'Partition to delete by max ttl: %', partition; | ||
124 | + EXECUTE format('DROP TABLE IF EXISTS %I', partition); | ||
125 | + deleted := deleted + 1; | ||
126 | + ELSE | ||
127 | + partition_month := SPLIT_PART(partition, '_', 4)::integer; | ||
128 | + IF partition_year = partition_by_max_ttl_year::integer THEN | ||
129 | + IF partition_month >= partition_by_max_ttl_month::integer THEN | ||
130 | + RAISE NOTICE 'Skip iteration! Partition: % is valid!', partition; | ||
131 | + CONTINUE; | ||
132 | + ELSE | ||
133 | + RAISE NOTICE 'Partition to delete by max ttl: %', partition; | ||
134 | + EXECUTE format('DROP TABLE IF EXISTS %I', partition); | ||
135 | + deleted := deleted + 1; | ||
136 | + END IF; | ||
137 | + END IF; | ||
138 | + END IF; | ||
139 | + END IF; | ||
140 | + END LOOP; | ||
141 | + END IF; | ||
142 | + ELSE | ||
143 | + IF partition_type = 'DAYS' THEN | ||
144 | + IF partition_by_max_ttl_month IS NULL THEN | ||
145 | + RAISE NOTICE 'Failed to remove days partitions by max ttl date due to partition_by_max_ttl_month is null!'; | ||
146 | + ELSE | ||
147 | + IF partition_by_max_ttl_day IS NULL THEN | ||
148 | + RAISE NOTICE 'Failed to remove days partitions by max ttl date due to partition_by_max_ttl_day is null!'; | ||
149 | + ELSE | ||
150 | + FOR partition IN SELECT tablename | ||
151 | + FROM pg_tables | ||
152 | + WHERE schemaname = 'public' | ||
153 | + AND tablename like 'ts_kv_' || '%' | ||
154 | + AND tablename != 'ts_kv_latest' | ||
155 | + AND tablename != 'ts_kv_dictionary' | ||
156 | + AND tablename != 'ts_kv_indefinite' | ||
157 | + AND tablename != partition_by_max_ttl_date | ||
158 | + LOOP | ||
159 | + partition_year := SPLIT_PART(partition, '_', 3)::integer; | ||
160 | + IF partition_year > partition_by_max_ttl_year::integer THEN | ||
161 | + RAISE NOTICE 'Skip iteration! Partition: % is valid!', partition; | ||
162 | + CONTINUE; | ||
163 | + ELSE | ||
164 | + IF partition_year < partition_by_max_ttl_year::integer THEN | ||
165 | + RAISE NOTICE 'Partition to delete by max ttl: %', partition; | ||
166 | + EXECUTE format('DROP TABLE IF EXISTS %I', partition); | ||
167 | + deleted := deleted + 1; | ||
168 | + ELSE | ||
169 | + partition_month := SPLIT_PART(partition, '_', 4)::integer; | ||
170 | + IF partition_month > partition_by_max_ttl_month::integer THEN | ||
171 | + RAISE NOTICE 'Skip iteration! Partition: % is valid!', partition; | ||
172 | + CONTINUE; | ||
173 | + ELSE | ||
174 | + IF partition_month < partition_by_max_ttl_month::integer THEN | ||
175 | + RAISE NOTICE 'Partition to delete by max ttl: %', partition; | ||
176 | + EXECUTE format('DROP TABLE IF EXISTS %I', partition); | ||
177 | + deleted := deleted + 1; | ||
178 | + ELSE | ||
179 | + partition_day := SPLIT_PART(partition, '_', 5)::integer; | ||
180 | + IF partition_day >= partition_by_max_ttl_day::integer THEN | ||
181 | + RAISE NOTICE 'Skip iteration! Partition: % is valid!', partition; | ||
182 | + CONTINUE; | ||
183 | + ELSE | ||
184 | + IF partition_day < partition_by_max_ttl_day::integer THEN | ||
185 | + RAISE NOTICE 'Partition to delete by max ttl: %', partition; | ||
186 | + EXECUTE format('DROP TABLE IF EXISTS %I', partition); | ||
187 | + deleted := deleted + 1; | ||
188 | + END IF; | ||
189 | + END IF; | ||
190 | + END IF; | ||
191 | + END IF; | ||
192 | + END IF; | ||
193 | + END IF; | ||
194 | + END LOOP; | ||
195 | + END IF; | ||
196 | + END IF; | ||
197 | + END IF; | ||
198 | + END IF; | ||
199 | + END IF; | ||
200 | + END IF; | ||
201 | + END IF; | ||
202 | + END IF; | ||
203 | +END | ||
204 | +$$; | ||
205 | + | ||
206 | +CREATE OR REPLACE FUNCTION get_partition_by_max_ttl_date(IN partition_type varchar, IN date timestamp, OUT partition varchar) AS | ||
207 | +$$ | ||
208 | +BEGIN | ||
209 | + CASE | ||
210 | + WHEN partition_type = 'DAYS' THEN | ||
211 | + partition := 'ts_kv_' || to_char(date, 'yyyy') || '_' || to_char(date, 'MM') || '_' || to_char(date, 'dd'); | ||
212 | + WHEN partition_type = 'MONTHS' THEN | ||
213 | + partition := 'ts_kv_' || to_char(date, 'yyyy') || '_' || to_char(date, 'MM'); | ||
214 | + WHEN partition_type = 'YEARS' THEN | ||
215 | + partition := 'ts_kv_' || to_char(date, 'yyyy'); | ||
216 | + ELSE | ||
217 | + partition := NULL; | ||
218 | + END CASE; | ||
219 | + IF partition IS NOT NULL THEN | ||
220 | + IF NOT EXISTS(SELECT | ||
221 | + FROM pg_tables | ||
222 | + WHERE schemaname = 'public' | ||
223 | + AND tablename = partition) THEN | ||
224 | + partition := NULL; | ||
225 | + RAISE NOTICE 'Failed to found partition by ttl'; | ||
226 | + END IF; | ||
227 | + END IF; | ||
228 | +END; | ||
229 | +$$ LANGUAGE plpgsql; | ||
230 | + | ||
231 | +CREATE OR REPLACE FUNCTION to_uuid(IN entity_id varchar, OUT uuid_id uuid) AS | ||
232 | +$$ | ||
233 | +BEGIN | ||
234 | + uuid_id := substring(entity_id, 8, 8) || '-' || substring(entity_id, 4, 4) || '-1' || substring(entity_id, 1, 3) || | ||
235 | + '-' || substring(entity_id, 16, 4) || '-' || substring(entity_id, 20, 12); | ||
236 | +END; | ||
237 | +$$ LANGUAGE plpgsql; | ||
238 | + | ||
239 | +CREATE OR REPLACE FUNCTION delete_device_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | ||
240 | + OUT deleted bigint) AS | ||
241 | +$$ | ||
242 | +BEGIN | ||
243 | + EXECUTE format( | ||
244 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT device.id as entity_id FROM device WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | ||
245 | + tenant_id, customer_id, ttl) into deleted; | ||
246 | +END; | ||
247 | +$$ LANGUAGE plpgsql; | ||
248 | + | ||
249 | +CREATE OR REPLACE FUNCTION delete_asset_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | ||
250 | + OUT deleted bigint) AS | ||
251 | +$$ | ||
252 | +BEGIN | ||
253 | + EXECUTE format( | ||
254 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT asset.id as entity_id FROM asset WHERE tenant_id = %L and customer_id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | ||
255 | + tenant_id, customer_id, ttl) into deleted; | ||
256 | +END; | ||
257 | +$$ LANGUAGE plpgsql; | ||
258 | + | ||
259 | +CREATE OR REPLACE FUNCTION delete_customer_records_from_ts_kv(tenant_id uuid, customer_id uuid, ttl bigint, | ||
260 | + OUT deleted bigint) AS | ||
261 | +$$ | ||
262 | +BEGIN | ||
263 | + EXECUTE format( | ||
264 | + 'WITH deleted AS (DELETE FROM ts_kv WHERE entity_id IN (SELECT customer.id as entity_id FROM customer WHERE tenant_id = %L and id = %L) AND ts < %L::bigint RETURNING *) SELECT count(*) FROM deleted', | ||
265 | + tenant_id, customer_id, ttl) into deleted; | ||
266 | +END; | ||
267 | +$$ LANGUAGE plpgsql; | ||
268 | + | ||
269 | +CREATE OR REPLACE PROCEDURE cleanup_timeseries_by_ttl(IN null_uuid uuid, | ||
270 | + IN system_ttl bigint, INOUT deleted bigint) | ||
271 | + LANGUAGE plpgsql AS | ||
272 | +$$ | ||
273 | +DECLARE | ||
274 | + tenant_cursor CURSOR FOR select tenant.id as tenant_id | ||
275 | + from tenant; | ||
276 | + tenant_id_record uuid; | ||
277 | + customer_id_record uuid; | ||
278 | + tenant_ttl bigint; | ||
279 | + customer_ttl bigint; | ||
280 | + deleted_for_entities bigint; | ||
281 | + tenant_ttl_ts bigint; | ||
282 | + customer_ttl_ts bigint; | ||
283 | +BEGIN | ||
284 | + OPEN tenant_cursor; | ||
285 | + FETCH tenant_cursor INTO tenant_id_record; | ||
286 | + WHILE FOUND | ||
287 | + LOOP | ||
288 | + EXECUTE format( | ||
289 | + 'select attribute_kv.long_v from attribute_kv where attribute_kv.entity_id = %L and attribute_kv.attribute_key = %L', | ||
290 | + tenant_id_record, 'TTL') INTO tenant_ttl; | ||
291 | + if tenant_ttl IS NULL THEN | ||
292 | + tenant_ttl := system_ttl; | ||
293 | + END IF; | ||
294 | + IF tenant_ttl > 0 THEN | ||
295 | + tenant_ttl_ts := (EXTRACT(EPOCH FROM current_timestamp) * 1000 - tenant_ttl::bigint * 1000)::bigint; | ||
296 | + deleted_for_entities := delete_device_records_from_ts_kv(tenant_id_record, null_uuid, tenant_ttl_ts); | ||
297 | + deleted := deleted + deleted_for_entities; | ||
298 | + RAISE NOTICE '% telemetry removed for devices where tenant_id = %', deleted_for_entities, tenant_id_record; | ||
299 | + deleted_for_entities := delete_asset_records_from_ts_kv(tenant_id_record, null_uuid, tenant_ttl_ts); | ||
300 | + deleted := deleted + deleted_for_entities; | ||
301 | + RAISE NOTICE '% telemetry removed for assets where tenant_id = %', deleted_for_entities, tenant_id_record; | ||
302 | + END IF; | ||
303 | + FOR customer_id_record IN | ||
304 | + SELECT customer.id AS customer_id FROM customer WHERE customer.tenant_id = tenant_id_record | ||
305 | + LOOP | ||
306 | + EXECUTE format( | ||
307 | + 'select attribute_kv.long_v from attribute_kv where attribute_kv.entity_id = %L and attribute_kv.attribute_key = %L', | ||
308 | + customer_id_record, 'TTL') INTO customer_ttl; | ||
309 | + IF customer_ttl IS NULL THEN | ||
310 | + customer_ttl_ts := tenant_ttl_ts; | ||
311 | + ELSE | ||
312 | + IF customer_ttl > 0 THEN | ||
313 | + customer_ttl_ts := | ||
314 | + (EXTRACT(EPOCH FROM current_timestamp) * 1000 - | ||
315 | + customer_ttl::bigint * 1000)::bigint; | ||
316 | + END IF; | ||
317 | + END IF; | ||
318 | + IF customer_ttl_ts IS NOT NULL AND customer_ttl_ts > 0 THEN | ||
319 | + deleted_for_entities := | ||
320 | + delete_customer_records_from_ts_kv(tenant_id_record, customer_id_record, | ||
321 | + customer_ttl_ts); | ||
322 | + deleted := deleted + deleted_for_entities; | ||
323 | + RAISE NOTICE '% telemetry removed for customer with id = % where tenant_id = %', deleted_for_entities, customer_id_record, tenant_id_record; | ||
324 | + deleted_for_entities := | ||
325 | + delete_device_records_from_ts_kv(tenant_id_record, customer_id_record, | ||
326 | + customer_ttl_ts); | ||
327 | + deleted := deleted + deleted_for_entities; | ||
328 | + RAISE NOTICE '% telemetry removed for devices where tenant_id = % and customer_id = %', deleted_for_entities, tenant_id_record, customer_id_record; | ||
329 | + deleted_for_entities := delete_asset_records_from_ts_kv(tenant_id_record, | ||
330 | + customer_id_record, | ||
331 | + customer_ttl_ts); | ||
332 | + deleted := deleted + deleted_for_entities; | ||
333 | + RAISE NOTICE '% telemetry removed for assets where tenant_id = % and customer_id = %', deleted_for_entities, tenant_id_record, customer_id_record; | ||
334 | + END IF; | ||
335 | + END LOOP; | ||
336 | + FETCH tenant_cursor INTO tenant_id_record; | ||
337 | + END LOOP; | ||
338 | +END | ||
339 | +$$; |
1 | +-- | ||
2 | +-- Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +DROP TYPE json IF EXISTS; | ||
18 | +CREATE TYPE json AS varchar; | ||
19 | +DROP TYPE jsonb IF EXISTS; | ||
20 | +CREATE TYPE jsonb AS other; |
1 | +-- | ||
2 | +-- Copyright © 2016-2020 The Thingsboard Authors | ||
3 | +-- | ||
4 | +-- Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +-- you may not use this file except in compliance with the License. | ||
6 | +-- You may obtain a copy of the License at | ||
7 | +-- | ||
8 | +-- http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +-- | ||
10 | +-- Unless required by applicable law or agreed to in writing, software | ||
11 | +-- distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +-- See the License for the specific language governing permissions and | ||
14 | +-- limitations under the License. | ||
15 | +-- | ||
16 | + | ||
17 | +/** SYSTEM **/ | ||
18 | + | ||
19 | +/** System admin **/ | ||
20 | +INSERT INTO tb_user ( id, created_time, tenant_id, customer_id, email, search_text, authority ) | ||
21 | +VALUES ( '5a797660-4612-11e7-a919-92ebcb67fe33', 1592576748000, '13814000-1dd2-11b2-8080-808080808080', '13814000-1dd2-11b2-8080-808080808080', 'sysadmin@thingsboard.org', | ||
22 | + 'sysadmin@thingsboard.org', 'SYS_ADMIN' ); | ||
23 | + | ||
24 | +INSERT INTO user_credentials ( id, created_time, user_id, enabled, password ) | ||
25 | +VALUES ( '61441950-4612-11e7-a919-92ebcb67fe33', 1592576748000, '5a797660-4612-11e7-a919-92ebcb67fe33', true, | ||
26 | + '$2a$10$5JTB8/hxWc9WAy62nCGSxeefl3KWmipA9nFpVdDa0/xfIseeBB4Bu' ); | ||
27 | + | ||
28 | +/** System settings **/ | ||
29 | +INSERT INTO admin_settings ( id, created_time, key, json_value ) | ||
30 | +VALUES ( '6a2266e4-4612-11e7-a919-92ebcb67fe33', 1592576748000, 'general', '{ | ||
31 | + "baseUrl": "http://localhost:8080" | ||
32 | +}' ); | ||
33 | + | ||
34 | +INSERT INTO admin_settings ( id, created_time, key, json_value ) | ||
35 | +VALUES ( '6eaaefa6-4612-11e7-a919-92ebcb67fe33', 1592576748000, 'mail', '{ | ||
36 | + "mailFrom": "Thingsboard <sysadmin@localhost.localdomain>", | ||
37 | + "smtpProtocol": "smtp", | ||
38 | + "smtpHost": "localhost", | ||
39 | + "smtpPort": "25", | ||
40 | + "timeout": "10000", | ||
41 | + "enableTls": false, | ||
42 | + "tlsVersion": "TLSv1.2", | ||
43 | + "username": "", | ||
44 | + "password": "" | ||
45 | +}' ); |
@@ -519,9 +519,9 @@ spring: | @@ -519,9 +519,9 @@ spring: | ||
519 | database-platform: "${SPRING_JPA_DATABASE_PLATFORM:org.hibernate.dialect.PostgreSQLDialect}" | 519 | database-platform: "${SPRING_JPA_DATABASE_PLATFORM:org.hibernate.dialect.PostgreSQLDialect}" |
520 | datasource: | 520 | datasource: |
521 | driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}" | 521 | driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}" |
522 | - url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/thingsboard}" | 522 | + url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://101.133.234.90:5432/thingsboard-3.3.2}" |
523 | username: "${SPRING_DATASOURCE_USERNAME:postgres}" | 523 | username: "${SPRING_DATASOURCE_USERNAME:postgres}" |
524 | - password: "${SPRING_DATASOURCE_PASSWORD:postgres}" | 524 | + password: "${SPRING_DATASOURCE_PASSWORD:Pgsql@yunteng}" |
525 | hikari: | 525 | hikari: |
526 | maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}" | 526 | maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}" |
527 | 527 |