2010-10-25 8 views

Odpowiedz

20

Jeśli mówimy o dwóch bazach danych na tym samym serwerze: tak, procedura składowana może uzyskać dostęp do innej bazy danych. Musisz upewnić się, że użytkownik, którego uprawnienia uruchamia procedura, ma niezbędne uprawnienia do każdej bazy danych.

Załóżmy na przykład, że istnieją dwie bazy danych na tym samym serwerze: mydb1 i mydb2, a każda z nich zawiera tabelę o nazwie messages o tej samej strukturze. Załóżmy, że chcesz dodać procedurę przechowywaną do mydb2, która opróżnia tabelę messages w mydb2 i kopiuje zawartość tabeli messages w mydb1. Możesz to zrobić:

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 

Zobacz, jak w pełni zakwalifikowałem tabele z bazami danych, do których należą. W rzeczywistości można twierdzić, że jestem zbyt gorliwy tutaj, ponieważ określiliśmy, że ta procedura przechowywana będzie należeć do mydb2. Nie muszę dodawać mydb2. Kwalifikator:. Jeśli procedura przechowywana była w bazie danych mydb1, potrzebowałbym tych kwalifikatorów, ale odwrotnie, nie potrzebowałbym mydb1. gdzie pojawia się.

Aby móc uruchomić tę procedurę (ewentualnie aby móc go zdefiniować?), To muszę się upewnić, mój użytkownik ma DELETE i INSERT przywileje na mydb2, a także SELECT przywileje mydb1.

Bazy danych na różnych serwerach brzmią bardziej skomplikowanie.

+0

co jeśli chcę użytkownika ** a * * aby móc wywołać procedurę, która manipuluje bazą danych ** b **, ale nie chcę, żeby użytkownik ** a ** miał te uprawnienia w bazie danych ** b ** ... na przykład kontrolowane usuwanie: I wouldn nie zezwalaj użytkownikowi ** a ** na wykonywanie dowolnych instrukcji usuwania w bazie danych ** b **, ale może chciałbym, aby mógł usunąć określone informacje określone w procedurze przechowywanej, takie jak pamięć podręczna. –

+0

@santiago arizti, jak rozumiem, zachowanie, które opisujesz, jest już nadane przez klauzulę "SQL SECURITY DEFINER". – Hammerite

+0

ciekawe, pozwala zobaczyć ... –

0

IMHO może pracować z 2 bazami danych na jednym serwerze, ale tylko jeśli mają takie same dane logowania. Nie jest to możliwe na 2 różnych serwerach.

Procedura składowana jest wykonywana w ramach jednego połączenia z bazą danych. Wszystkie bazy danych, do których ma dostęp login połączenia, są dostępne w procedurze przechowywanej.

0

Po prostu użyj nazwy database.tablename notation. Zdalne bazy danych - nie znam takiego sposobu w MySQL. Jest to możliwe w MS SQL Server.

1

Można również użyć różnych baz danych na różnych serwerach, ale trzeba je połączyć i używać tego samego konta (na przykład aktywne konto Directory) dla obu z nich połączyć

Powiązane problemy