Problém s připojením k MSSQL na Azure

H0w4rd
Člen | 94
+
0
-

Neřešil jste prosím někdo připojení k MSSQL na Azure přes sqlsrv?

Kámen úrazu spočívá asi v tom, že prý na Azure MSSQL se nedá nastavit u uživatelů defaultní databáze a tudíž v dotazech musím uvádět název schématu.

Pokud v Repository třídě udělám $this->context->table(‚tabulka‘), dostanu chybu od databáze

SQLSTATE[42S02]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name ‚tabulka‘.

protože do databáze se pošle dotaz

SELECT * FROM tabulka

který nefunguje, musel by tam být název schématu.

Pokud však udělám $this->context->table(‚schema.tabulka‘), dostanu chybu od Nette

Table ‚schema.tabulka‘ does not exist

Nepomůže ani uvést název databáze, ani dát tabulky do hranatých závorek – $this->context->table(‚[schema].[tabulka]‘)

Table ‚[schema].[tabulka]‘ does not exist

V neonu to vypadá takhle:

dsn: ‚sqlsrv:server=xxxyyyzzz.database.windows.net;database=DATABAZE‘
user: USER
password: „PASSWORD“

Pokud si mimo Nette vytvořím instanci PDO a uvedu tam ty samé údaje, připojení se vytvoří, mohu posílat dotazy se schématem a funguje to

$stmt = $db->prepare(„SELECT * FROM schema.tabulka“);

Nette database si zřejmě validuje název tabulky a:

  • při tabulka to validací projde, ale z databáze se vrátí error, protože chybí název schématu
  • při čemkoliv jiném to validací neprojde, nette vrátí chybu a do databáze se to ani nedostane

Jak tohle vyřešit?

boschcb
Gold Partner | 3
+
0
-

Vyřešit se to bude muset až aktualizací sqlsrv driveru nette/database. V tuhle chvíli ten driver vůbec nebere schéma v potaz a když si stahuje seznam tabulek databáze, tak to vrátí bez schémat. Myslím, že to bude fungovat, pokud budeš používat pouze schéma dbo. Pokud chceš používat nette/database a používáš schémata, tak pak jedině přes metodu „query“ a psát si dotaz sám, v takovém případě to totiž nestahuje strukturu databáze a funguje to.

Michal Kumžák
Člen | 106
+
0
-

Nepoužívám sice MSSQL na Azure, ale taky používám schemata a píšu to prostě v klasickém SQL, např.:

$this->helios->query("UPDATE dbo.TabZakazka SET Ukonceno=0 WHERE ID=?", $this->commissionId);

Možná to budeě potřebovat, tak to sem dám. Problém sem měl s voláním procedur a zpětným získáním hodnot. To sem nakonec vyřešil tím, že jsem si z připojení vytáhl PDO a řešil to přímo PDO metodama, např.:

$sql = "EXEC dbo.hp_InsertHlavickyOZ @Ident=?, @Sklad=?, @DruhPohybu=?, @RadaDokladu=?, @Insert=?, @IDPosta=?,
		@Mena=?, @CisloOrg=?, @DatumPorizeni=?";
try {
	$pdo = $this->helios->getPdo();
	$stmt = $pdo->prepare($sql);
	$this->invoiceId = (int)$this->invoiceId;
	$ident = &$this->invoiceId;
	$stmt->bindParam(1, $ident, \PDO::PARAM_INT|\PDO::PARAM_INPUT_OUTPUT, 20);
	$stmt->bindParam(2, $sklad);
	$stmt->bindParam(3, $druhpohybu);
	$stmt->bindParam(4, $radadokladu);
	$stmt->bindParam(5, $insert);
	$stmt->bindParam(6, $posta);
	$stmt->bindParam(7, $mena);
	$stmt->bindParam(8, $org);
	$stmt->bindParam(9, $datum);
	$stmt->execute();
	$stmt = NULL;
} catch (\PDOException $e) {
	$this->helios->rollBack();
	die('Chyba při vkládání faktury: '.$e->getMessage());
}