如何讓MySQL的表只能查,不能修改,MySQL的只讀表
阿新 • • 發佈:2021-12-30
收到客戶一個有意思的需求
- A例項下的demo庫的t1要用複製同步到B例項,為了防止B例項會對這些資料做修改操作,需要限制B例項對t1表的修改操作.只允許查
第一想到的是用許可權管理控制,收回B例項下所有使用者對t1表的許可權,但這個操作在5.7裡面十分繁瑣,且5.7不支援回收部分許可權(8.0支援)
搜尋網路上的一些解決方案,發現用觸發器的方式十分合適,分別建立3個觸發器,來控制對t1表的insert,update,delete行為,這樣就做到了,A例項用複製同步時不受到影響但B例項想修改這些資料不允許操作
/* triggers */ delimiter // DROP TRIGGER IF EXISTS stop_table_insert; CREATE TRIGGER stop_table_insert BEFORE INSERT ON `demo`.`t1` FOR EACH ROW BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'This table Only replication synchronization is allowed, but data cannot be modified'; END;// DROP TRIGGER IF EXISTS stop_table_update; CREATE TRIGGER stop_table_update BEFORE UPDATE ON `demo`.`t1` FOR EACH ROW BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'This table Only replication synchronization is allowed, but data cannot be modified'; END;// DROP TRIGGER IF EXISTS stop_table_delete; CREATE TRIGGER stop_table_delete BEFORE DELETE ON `demo`.`t1` FOR EACH ROW BEGIN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'This table Only replication synchronization is allowed, but data cannot be modified'; END;// delimiter ;
注意: SQLSTATE '45000'是使用者自定義錯誤狀態值的標準寫法,官方文件描述是: To signal a generic SQLSTATE value, use '45000', which means “unhandled user-defined exception" ,MESSAGE_TEXT可隨意定義