Hi,Databend 的朋友们!🚀
九月我们把重点放在了 生产环境真正需要的功能上。这个月上线了行级访问控制、Check 约束、AUTOINCREMENT 自增列、基于事务的表名交换(SWAP),还有智能的 SQL 错误提示。这些都是企业用户一直在等的功能。
15+ 个新功能, 30+ 个 bug 修复, 15+ 项性能优化,还有 10+ 项其他改进。最值得说的:安全管控更严了、数据校验更方便了、大结果集也不怕了。
做多租户 SaaS 最头疼的就是数据隔离。现在有了行级策略,一次定义,到处生效。
-- 定义策略:每个租户只能看自己的数据 CREATE ROW ACCESS POLICY tenant_isolation AS (tenant_id INT) RETURNS BOOLEAN -> tenant_id = CURRENT_TENANT(); -- 加到表上 ALTER TABLE customer_data ADD ROW ACCESS POLICY tenant_isolation(tenant_id); -- 以后所有查询都自动过滤 SELECT * FROM customer_data; -- 用户只能看到自己租户的数据,想越权都不行
有啥好处:
以前要自增 ID,得先建 Sequence,再在表里 NEXTVAL,删表还得记得删 Sequence。现在不用了。
以前的写法:
CREATE SEQUENCE user_id_seq START 1 INCREMENT 1;
CREATE TABLE users (id INT DEFAULT NEXTVAL('user_id_seq'), name VARCHAR);
-- 删表时还得记得删 Sequence,容易忘
现在这样写:
CREATE TABLE users (
id INT AUTOINCREMENT,
name VARCHAR,
email VARCHAR
);
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
-- ID 自动从 0 开始:0, 1, 2...
各种灵活的用法:
-- 最简单的 id INT AUTOINCREMENT -- 从 1000 开始,每次加 10 order_id INT AUTOINCREMENT (1000, 10) -- 1000, 1010, 1020... -- MySQL 风格的写法也支持 invoice_id INT IDENTITY START 1000 INCREMENT 10 -- 一张表可以有多个自增列 CREATE TABLE events ( event_id INT AUTOINCREMENT, sequence_num INT AUTOINCREMENT, data VARCHAR );
好处显而易见:
数据校验以前都写在应用里,容易漏。现在可以直接写到表结构上。
CREATE TABLE products (
id INT AUTOINCREMENT,
name VARCHAR NOT NULL,
price DECIMAL(10,2),
discount_percent INT,
stock INT,
CONSTRAINT price_valid CHECK (price > 0),
CONSTRAINT discount_range CHECK (discount_percent BETWEEN 0 AND 100),
CONSTRAINT stock_non_negative CHECK (stock >= 0)
);
-- 正常数据,没问题
INSERT INTO products (name, price, discount_percent, stock)
VALUES ('Widget', 59.99, 10, 100);
-- 不符合规则的数据,直接拒绝
INSERT INTO products (name, price, discount_percent, stock)
VALUES ('Gadget', -10.00, 150, -5);
-- Error: CHECK constraint failed
有啥用:
ALTER TABLE ADD/DROP CONSTRAINT 调整规则system.constraints 就行单事务原子交换两个表名,解决大表结构变更的对业务的影响的问题。
痛点:
-- 传统方法:两步RENAME中间有间隙 ALTER TABLE orders RENAME TO orders_backup; -- 第1步 ALTER TABLE orders_v2 RENAME TO orders; -- 第2步 -- ⚠️ 这两步之间orders不存在,应用查询会失败
解决方案:
-- 1. 创建新结构的表 CREATE TABLE orders_v2 ( order_id INT, user_id INT, amount DECIMAL(10,2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 新增列 status VARCHAR DEFAULT 'pending' -- 新增列 ); -- 2. 离线迁移数据 INSERT INTO orders_v2 SELECT *, CURRENT_TIMESTAMP, 'completed' FROM orders; -- 3. 单事务内原子交换 ALTER TABLE orders SWAP WITH orders_v2; -- ✓ orders和orders_v2在同一事务内互换名字 -- ✓ 应用全程可以访问orders,零停机
适用场景:
打错命令的时候,现在会给你提示了。
SHOW TABLE; -- 以前: "unexpected TABLE, expecting STATUS, TABLES..." -- 现在: "Did you mean SHOW TABLES or SHOW TABLE FUNCTIONS?" VACUUM TEMPARE FILES; -- 提示: "Did you mean VACUUM TEMPORARY FILES?"
实用:
九月的主题就是生产可用。 行级安全、数据校验、自增列、大结果集处理,这些都是企业用户天天要用的功能。Databend 在保持云原生架构的同时,功能完整度越来越接近企业级数据库。
多租户 SaaS 有了数据隔离。DBA 有了声明式约束。应用有了自增 ID。大查询也不怕 OOM 了。实实在在解决生产问题。
🔗 立即体验
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042558/viewspace-3097389/ ,如需转载,请注明出处,否则将追究法律责任。