Bild in Tabelle laden (TSQL/2005)

13/07/2009 - 15:38 von Gerald Aichholzer | Report spam
Hallo NG,

ich möchte gerne ein Bild in eine Tabelle bilder(bild_id, bild)
laden. Die Problematik ist dabei, dass der Bildname dynamisch
ist. Ich habe mir dazu folgende gespeicherte Prozedur gebastelt:

create procedure dbo.usp_import_bild
@bildid int
,@bildpfad nvarchar(200)
as
declare @sql nvarchar(max)

set @sql = replace(
replace (
N'insert into dbo.bilder( bild_id, bild )
select <BILDID>, x.BulkColumn
from openrowset(bulk, ''<BILDPFAD>'', SINGLE_BLOB) x',
'<BILDID>', cast(@bildid as nvarchar)),
'<BILDPFAD>', @bildpfad)

print @sql

delete dbo.bilder where bild_id = @bildid

exec sp_executesql @sql



In der Anwendung wàhlt der Anwender ein Bild aus (mit dem vom
Server aus sichtbaren Pfad). Anschließend wird obige Prozedur
aufgerufen.

Auf Testsystem funktioniert alles einwandfrei. Beim Kunden
kommt es jedoch zu einer Fehlermeldung, dass das die Datei
nicht gefunden wird.

Ich habe leider keinen direkten Zugang zum SQL Server beim
Kunden, aber in der Anwendung gibt es eine SQL-Console, mit
deren Hilfe ich folgendes herausgefunden habe:


insert into dbo.bilder( bild_id, bild )
select 99, x.BulkColumn
from openrowset(bulk, '\\server\freigabe\bild.png', SINGLE_BLOB) x


declare @sql nvarchar(max)
set @sql = N'
insert into dbo.bilder( bild_id, bild )
select 99, x.BulkColumn
from openrowset(bulk, ''\\server\freigabe\bild.png'', SINGLE_BLOB) x
'

exec sp_executesql @sql


Anscheinend kann im Kontext, in dem das dynamische SQL aus-
geführt wird, nicht auf die Freigabe zugegriffen werden.
Wie kann ich das àndern?

Oder: gibt es noch andere Möglichkeiten, mit T-SQL Bilder in
die Datenbank zu laden?

Hintergrundinformation (warum die Bilder in der DB gespeichert
werden): die Tabelle wird in Reporting Services Berichten ver-
wendet, um pro Detaildatensatz ein Bild anzuzeigen.

vielen Dank für jede Hilfe und schöne Grüße,
Gerald
 

Lesen sie die antworten

#1 Elmar Boye
14/07/2009 - 11:14 | Warnen spam
Hallo Gerald,

"Gerald Aichholzer" schrieb ...
ich möchte gerne ein Bild in eine Tabelle bilder(bild_id, bild)
laden.

insert into dbo.bilder( bild_id, bild )
select 99, x.BulkColumn
from openrowset(bulk, '\\server\freigabe\bild.png', SINGLE_BLOB) x


declare @sql nvarchar(max)
set @sql = N'
insert into dbo.bilder( bild_id, bild )
select 99, x.BulkColumn
from openrowset(bulk, ''\\server\freigabe\bild.png'', SINGLE_BLOB) x
'

exec sp_executesql @sql


Anscheinend kann im Kontext, in dem das dynamische SQL aus-
geführt wird, nicht auf die Freigabe zugegriffen werden.



was die Berechtigungen angeht, das gilt das gleiche wie bei
BULK INSERT - Recycling aus dem anderen Thread:

Siehe http://msdn.microsoft.com/de-de/lib...75915.aspx
"Importieren von Massendaten mithilfe von BULK INSERT oder OPENROWSET(BULK...)"
und dort insbesondere den Abschnitt:
"Überlegungen zur Sicherheit"

In Deinem Fall kàme hinzu, dass für dynamisches SQL das
ausführende Konto gilt, nicht etwa die Berechtigung
für die Prozedur.

Oder: gibt es noch andere Möglichkeiten, mit T-SQL Bilder in
die Datenbank zu laden?



In T-SQL wirst in allen Szenarien auf àhnliche Probleme stossen,
denn das Berechtigungskonzept ist durchgàngig.

Ein alternativer Ansatz, verwende ADODB Stream zum Laden,
das kann ggf. von einem Client ausgeführt werden, z. B.:
http://support.microsoft.com/kb/258038

Gruß Elmar

Ähnliche fragen