如果我们要讨论的是同一台服务器上的两个数据库:是的,存储过程可以访问另一个数据库。您必须确保正在以其特权运行该过程的用户在每个数据库上都具有必需的特权。
例如,假设你有在同一服务器上的两个数据库,mydb1
并mydb2
和每个包含一个名为表messages
具有相同的结构。假设你想存储的过程添加到mydb2
该清空messages
表mydb2
和复制的内容messages
表mydb1
。您可以这样做:
CREATE PROCEDURE `SynchroniseMessages` ()
LANGUAGE sql
NOT DETERMINISTIC
MODIFIES sql DATA
sql Security DEFINER
BEGIN
DELETE FROM `mydb2`.`messages`;
INSERT INTO
`mydb2`.`messages`
SELECT * FROM `mydb1`.`messages`;
END
查看我如何用表所属的数据库对表进行完全限定。实际上,您可能会说我在这里太热心了,因为我们指定了此存储过程将属于mydb2
。我不需要添加mydb2`.`限定符。如果存储过程在`mydb1`数据库中,那么我将需要那些限定符,但是相反,我将不需要
mydb1.
它出现的位置。
为了能够运行此过程(可能是为了对其进行定义?),我需要确保我的用户具有DELETE
和的INSERT
特权mydb2
,还具有的SELECT
特权mydb1
。
不同服务器上的数据库听起来要复杂得多。