Uprawnienia bazy i dostęp dla XL do tej bazy

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

przemkow
Posty: 4
Rejestracja: 04 wrz 2014, 12:29
Rola: Inny
Wersja: 2019

Uprawnienia bazy i dostęp dla XL do tej bazy

Post autor: przemkow »

Witam,

Stworzyłem funkcję która pobiera mi z drugiej bazy (np. "BAZALOK" - baza dodatkowa, do naszych wewnętrznych celów głównie) z jeden z tabel ("dbo.locations") lokalizacje towarów - funkcja pobiera tylko jedną kolumnę/rekord. W SSMS oraz w CR na użytkowniku sa - testując wydruk wszystko działa.

Niestety jak odpalam wydruk z XL to jest klapa :( i rzuca błędem:

Kod: Zaznacz cały

---------------------------
Crystal Report Viewer
---------------------------
Pobranie danych z bazy danych nie powiodło się.
Szczegóły: 08004:[Microsoft][SQL Server Native Client 10.0][SQL Server]Obiekt główny serwera „comarchxl” 
nie jest w stanie uzyskać dostępu do bazy danych „BAZALOK” 
przy bieżącym kontekście zabezpieczeń. [Kod dostawcy bazy danych: 916 ]
---------------------------
OK   
---------------------------
Próbowałem już dodawać w bazie (BAZALOK) użytkownika comarchxl(user i login: comarchxl, def_schema:dbo) z membership=db_owner , oraz w serwerze użytkownikowi "comarchxl" dodałem uprawnienia do bazy BAZALOK (login: comarchxl, schema: dbo).


Miałby ktoś pomysł jak to ugryźć? Wiem, że na pewno problem z uprawnieniami ale nie wiem jakie i jak (kolejność) dodać uprawnienia w bazie aby XL (i Crystal) mógł pobrać dane z tej dodatkowej bazy ?



FYI: Na wydruku potwierdzenia ZS potrzebuje drukować lokalizację przy pozycji towaru dla pracownika kompletującego ZS. W tej chwili używamy mojego programu (identyfikuje towar po kodzie i pokazuje lokalizację) i skanerów kodów (na wydruku jest kod towaru zakodowany w Code128 - tak udało mi się umieścić na wydruku Crystala działający kod kreskowy Code128 :D funkcję generującą go napisałem(zaadaptowałem) w samym Crystalu :ugeek: ) - ale żeby przyśpieszyć to, lepiej aby lokalizacja była drukowana
Załączniki
Uprwnienia na bazie (BAZALOK)
Uprwnienia na bazie (BAZALOK)
Screenshoot - user rights baza xl.jpg (111.65 KiB) Przejrzano 257 razy
Uprwnienia comarchxl na serwerze
Uprwnienia comarchxl na serwerze
Screenshoot - user rights baza xl 2.jpg (101.71 KiB) Przejrzano 257 razy

przemkow
Posty: 4
Rejestracja: 04 wrz 2014, 12:29
Rola: Inny
Wersja: 2019

Re: Uprawnienia bazy i dostęp dla XL do tej bazy

Post autor: przemkow »

Witam,

Odpowiem sam sobie:
Comarch tak zamyka XL (oraz CR) w bazie (i chyba nawet schemie CDN), że nie można w żaden sposób pobrać danych z poza.

Widziałem rozwiązanie przez replikację tabeli (paręnaście wątków wcześniej), ale to jest dostępne od wersji Standard serwera MSSQL (więc MSSQL Express - zapomnijta...) - mam standard na serwrerze, ale nie mam go na swoim komputerze, żeby to przetestować więc nie próbowałem...

Ja zaś rozwiązałem to tworząc tabelkę w bazie firmy:

Kod: Zaznacz cały

CREATE TABLE [CDN].[Lokalizacje] (
code varchar(40) not null primary key,
loc varchar(40) null,
ts DATETIME not null DEFAULT('2021-01-01 10:00:00')
)
Następnie funkcja która zwraca mi lokalizację (lub pusty string/varchar w przypadku null'a):

Kod: Zaznacz cały

CREATE FUNCTION [CDN].[PobierzLok] ( @code varchar(40) )
-- =============================================
-- Author:		Przemyslaw W
-- Create date: 2021-11-24 15:00
-- Description:	Funkcja zwraca ciag znakow - lokalizacje code 
--              (wg. kolumny [cdn].[TwrKarty].[Twr_Kod]).
--              Zwroci pusty ciag (nie 'null') jesli kod nie 
--              istnieje w tabeli CDN.[Lokalizacje] (kopia [MOJABAZA].[dbo].[locations] z [code],[loc], [ts] tylko)
-- =============================================
RETURNS varchar(40)
AS
BEGIN
	DECLARE @loc varchar(40);
	SELECT @loc=p.[loc] FROM [CDN].[Lokalizacje] p WHERE p.[code]=@pcode;
	SET @loc = ISNULL(@loc,'');
	RETURN @loc;
END
Funkcję wołam z poziomu wydruku w CR .



Oraz funkcję która jest wywoływana z "job" mssql serwera do synchronizacji (co 1h, nie mamy potrzeby aby była wywoływana częściej):

Kod: Zaznacz cały

CREATE PROCEDURE [cdn].[spAktualizujLokalizacjePoster]
-- =============================================
-- Author:		Przemyslaw W.
-- Create date: 2021-11-24
-- Description:	
--              Procedura odswierza tabele lokalizacji 
--              z bazy glownej MOJABAZA (MOJABAZA.dbo.locations).
--              Przewidziana do uruchamiania jako 
--              job z serwera SQL, z uprawnieniami uzytkownika 'sa' lub majacego 
--              dostęp do tabel: 
--                * MOJABAZA.dbo.locations (na: SELECT), oraz 
--                * ERPXL_<FIRMA>.CDN.Lokalizacje (na: DELETE+INSERT) .
--
--              Procedura używa transakcji do wymuszenia wykonania DML (DELETE)
--              ,a nastepnie INSERT INTO .. SELECT .. FROM
-- =============================================
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	BEGIN TRY;
	    BEGIN TRAN T1;
		-- CLEAN TABLE CDN.Lokalizacje
		DELETE FROM [CDN].[Lokalizacje] WHERE [code]<>null;
		COMMIT TRAN T1;
		
		BEGIN TRAN T1;
		-- Update data - only get records with location
		INSERT INTO [CDN].[Lokalizacje] SELECT [code],[loc],[ts] FROM [MOJABAZA].[dbo].[locations] WHERE ([loc]<>'' OR [loc]<>NULL);
		COMMIT TRAN T1;
	END TRY
	BEGIN CATCH
		ROLLBACK TRAN T1;
	END CATCH
END
GO
Używam transakcji aby DELETE zostało zakończone, w przeciwnym razie w dalszym kodzie przy INSERT wyrzuca błędy-zduplikowany primary key .
Mógłbym niszczyć tabelę, ale jakoś to jest takie "brzydkie" podejście :)

ODPOWIEDZ