MySQL不利於使用權限鎖定基於連接到數據庫的MySQL用戶的某些行。
如果您有用戶想要以這種方式進行限制,最好不要讓他們直接訪問數據庫,而是讓他們通過另一層進行連接。
使用視圖並不是一個好主意 - 每個用戶都必須使用不同的查詢(引用他們自己的個人視圖)來完成相同的任務。如果您只是限制用戶可以看到的列(而不是行),則視圖將是一個很好的解決方案。
它可以使用存儲過程來完成像你要找的東西:
# This table already exists in your schema
CREATE TABLE `user` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`email` VARCHAR(50) NOT NULL,
`instance` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES (NULL,'[email protected]','1');
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES (NULL,'[email protected]','2');
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES (NULL,'[email protected]','1');
# This would be a new table you would have to create
CREATE TABLE `user_instance` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user` VARCHAR(20) NOT NULL,
`instance` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_instance` (`user`,`instance`)
) ENGINE=INNODB;
INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user1','1');
INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user2','2');
# This is a stored procedure that might accomplish what you want
DELIMITER $$
CREATE PROCEDURE `p_get_users`()
BEGIN
SELECT `user`.`id`, `user`.`email`
FROM `user`
WHERE `user`.`instance` IN(
SELECT `instance`
FROM `user_instance`
WHERE `user` = USER());
END$$
DELIMITER ;
由於應用面正在增加實例= x到查詢的護理MySQL的只是一個附加的安全如果查詢意外沒有實例= x。 – iDev247
只是測試你的代碼,在代碼中沒有'意外'這樣的事情 –
謝謝你所有的答案和冗長的討論。我會考慮解決方案並給予適當的獎勵。 @pyrate我同意沒有意外的代碼。有了多個開發人員,從長遠來看,很難追蹤這類事情。這個問題的另一個原因是向我們處理的公司保證,在站點之間訪問用戶信息時存在技術安全邊界/限制。再次感謝! – iDev247