Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Appel d'une fonction sql depuis une fonction clr

8 réponses
Avatar
Clark [MVP CRM]
Bonjour
J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.
var cmd = new SqlCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText =
(@"select count(*) from Portfolios_Positions pp
where comptetitreid = '" +
CompteTitreId + "' and datereference = '" +
mouvement.dateReference.AddDays(-1) + "'")
};
conn.Open();
var nbPos = (int)cmd.ExecuteScalar();
J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé d'accéder à
des données dont l'accès est restreint par l'assembly.
Après essais, il s'avère que ce sont les appels faits dans cette procédure
stockée à d'autres fonctions (sql ou clr) qui provoquent cette erreur.
Y a t il un moyen de corriger ceci?
Merci

8 réponses

Avatar
Clark [MVP CRM]
pardon, une petite erreur de copier coller :
cmd = new SqlCommand
{
Connection = conn,
CommandType = CommandType.StoredProcedure,
CommandText = "CalculValoFromCompteAtDate",
};
var p1 = new SqlParameter("datePosition",
mouvement.dateReference.AddDays(-1));
var p2 = new SqlParameter("compteTitreId",
CompteTitreId);
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
t = (double)cmd.ExecuteScalar();
Voici le bon code
"Clark [MVP CRM]" a écrit dans le message de
news:
Bonjour
J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.
var cmd = new SqlCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText > (@"select count(*) from Portfolios_Positions
pp
where comptetitreid = '" +
CompteTitreId + "' and datereference = '" +
mouvement.dateReference.AddDays(-1) + "'")
};
conn.Open();
var nbPos = (int)cmd.ExecuteScalar();
J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé d'accéder à
des données dont l'accès est restreint par l'assembly.
Après essais, il s'avère que ce sont les appels faits dans cette procédure
stockée à d'autres fonctions (sql ou clr) qui provoquent cette erreur.
Y a t il un moyen de corriger ceci?
Merci


Avatar
Med Bouchenafa
Il est fort probable que ta procedure stockée fait un acces en dehors de
l'instance SQL Server courante et que tu as créé ton assembly avec un niveau
de security SAFE
Regarde la syntaxe de CREATE ASSEMBLY
Il y a trois niveaux pour PERMISSION_SET
SAFE
EXTERNAL_ACCESS
UNSAFE
Commence par faire un test avec EXTERNAL_ACCESS ou encore UNSAFE

Bien cordialement
Med Bouchenafa

"Clark [MVP CRM]" wrote in message
news:
Bonjour
J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.
var cmd = new SqlCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText > (@"select count(*) from Portfolios_Positions
pp
where comptetitreid = '" +
CompteTitreId + "' and datereference = '" +
mouvement.dateReference.AddDays(-1) + "'")
};
conn.Open();
var nbPos = (int)cmd.ExecuteScalar();
J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé d'accéder à
des données dont l'accès est restreint par l'assembly.
Après essais, il s'avère que ce sont les appels faits dans cette procédure
stockée à d'autres fonctions (sql ou clr) qui provoquent cette erreur.
Y a t il un moyen de corriger ceci?
Merci


Avatar
Fred
"Clark [MVP CRM]" a écrit dans le message de
news:
Bonjour



Bonjour,

En complément de indications de Med Bouchenafa

J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.



Je ne vois pas de procédure stockée dans le code mais je ne pense pas
que tu puisses altérer les données dans une fonction crl (de même qu'on
ne peut apeler une procédure stockée dans une fonction sql)
Ce n'est pas le cas dans ton code cependant.

J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé
d'accéder à des données dont l'accès est restreint par l'assembly.



j'ai mis un attribut sur la fonction dans un scénario analogue.
SqlFunctionAttribute avec le paramètre DataAccess à DataAccessKind.Read

(Je ne me souviens plus si cela fonctionnait sans et je ne peux tester
maintenant.)

--
Fred

Avatar
Clark [MVP CRM]
Bonjour
Non pas d'accès externe, tout se passe bien sur la même instance et sur la
même base.
De plus, le déploiement external_access ou unsafe n'est pas authorisé sur
mon serveur.
Dans la procédure stockée que j'exécute, je fais un select sur différents
champs de ma base dont certains calculés par ces fonctions. Si j'enlève les
champs calculés, ça fonctionne mais avec, pas moyen.
"Med Bouchenafa" a écrit dans le message de
news:
Il est fort probable que ta procedure stockée fait un acces en dehors de
l'instance SQL Server courante et que tu as créé ton assembly avec un
niveau de security SAFE
Regarde la syntaxe de CREATE ASSEMBLY
Il y a trois niveaux pour PERMISSION_SET
SAFE
EXTERNAL_ACCESS
UNSAFE
Commence par faire un test avec EXTERNAL_ACCESS ou encore UNSAFE

Bien cordialement
Med Bouchenafa

"Clark [MVP CRM]" wrote in message
news:
Bonjour
J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.
var cmd = new SqlCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText >> (@"select count(*) from Portfolios_Positions
pp
where comptetitreid = '" +
CompteTitreId + "' and datereference = '" +
mouvement.dateReference.AddDays(-1) + "'")
};
conn.Open();
var nbPos = (int)cmd.ExecuteScalar();
J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé d'accéder
à des données dont l'accès est restreint par l'assembly.
Après essais, il s'avère que ce sont les appels faits dans cette
procédure stockée à d'autres fonctions (sql ou clr) qui provoquent cette
erreur.
Y a t il un moyen de corriger ceci?
Merci





Avatar
Clark [MVP CRM]
Bonjour
Non je n'ai pas donné le code de la procédure stockée, car il s'agit juste
d'un select avec appel à une fonction mais ça donne ça grosso modo

CREATE PROCEDURE [dbo].[CalculValoFromCompteAtDate]
@datePosition datetime,
@compteTitreId uniqueidentifier
AS

select SUM(case when coupon is not null then valo + coupon else valo end) as
total from
(select
Cumul2.Qty * Cumul2.Cotation * Cumul2.TauxChange as Valo
,dbo.fn_CalculCouponCouru(Cumul2.ValeurId, @datePosition) * Cumul2.Qty /
Cumul2.TauxChange as Coupon
From (
select
Cumul.ValeurId
,Cumul.Qty
,v.deviseCotationParDefaut
,dbo.[fn_GetLastCotationFromValeurAndDevise](v.ValeurId, @datePosition,
v.deviseCotationParDefaut) as Cotation
,dbo.[fn_GetLastCotationDateFromValeurAndDevise](v.ValeurId, @datePosition,
v.deviseCotationParDefaut) as DateCotation
,case
when c.Devise = v.deviseCotationParDefaut then 1
else dbo.fn_GetLastTauxChangeFromDevise(c.Devise,
@datePosition,v.deviseCotationParDefaut)
end as TauxChange
,case
when c.Devise = v.deviseCotationParDefaut then null
else dbo.fn_GetLastTauxChangeDateFromDevise(c.Devise,
@datePosition,v.deviseCotationParDefaut)
end as DateTauxChange
,c.Devise
from ( select
ValeurId, sum(Quantite) as Qty
from ( select case
when cott.SensAchatVente = 'V' then cots.QuantiteEnPartsEntieres * -1
when cott.SensAchatVente = 'A' then cots.QuantiteEnPartsEntieres
end as Quantite
,v.ValeurId
,v.LibelleLongValeur as LibelleValeur
from comptes_operationstitres cots
inner join Comptes_OperationsTitres_TypesOperationsSGP cott on
cots.IdTypeOperationSGP = cott.IdTypeOperationSGP
inner join valeurs v on cots.ValeurId = v.ValeurId
where CompteTitreId = @compteTitreId and DateReference <= @datePosition
and cots.Annule = 0) OpTitres
group by ValeurId, LibelleValeur
having sum(Quantite) <> 0) Cumul inner join Valeurs v on Cumul.ValeurId =
v.ValeurId
inner join Comptes c on c.CompteId = @compteTitreId
) Cumul2) Cumul3

J'avais utilisé d'abord des CTE mais je les ai enlevé, un info trouvé sur le
net, m'ayant laissé supposé que le problème venait de là mais sans résultat.
Pour l'attribut [Microsoft.SqlServer.Server.SqlFunction(DataAccess =
DataAccessKind.Read)], je l'ai bien spécifié.
Merci
"Fred" a écrit dans le message de
news:%
"Clark [MVP CRM]" a écrit dans le message de
news:
Bonjour



Bonjour,

En complément de indications de Med Bouchenafa

J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.



Je ne vois pas de procédure stockée dans le code mais je ne pense pas que
tu puisses altérer les données dans une fonction crl (de même qu'on ne
peut apeler une procédure stockée dans une fonction sql)
Ce n'est pas le cas dans ton code cependant.

J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé d'accéder
à des données dont l'accès est restreint par l'assembly.



j'ai mis un attribut sur la fonction dans un scénario analogue.
SqlFunctionAttribute avec le paramètre DataAccess à DataAccessKind.Read

(Je ne me souviens plus si cela fonctionnait sans et je ne peux tester
maintenant.)

--
Fred




Avatar
Med Bouchenafa
Je reste curieux de savoir comment tu as pu bloqué
EXTERNAL_ACCESS
UNSAFE

Le message d'erreur avait l#air d'etre clair mais lá je ne vois pas du tout

Bien cordialement
Med Bouchenafa

"Clark [MVP CRM]" wrote in message
news:
Bonjour
Non pas d'accès externe, tout se passe bien sur la même instance et sur la
même base.
De plus, le déploiement external_access ou unsafe n'est pas authorisé sur
mon serveur.
Dans la procédure stockée que j'exécute, je fais un select sur différents
champs de ma base dont certains calculés par ces fonctions. Si j'enlève
les champs calculés, ça fonctionne mais avec, pas moyen.
"Med Bouchenafa" a écrit dans le message de
news:
Il est fort probable que ta procedure stockée fait un acces en dehors de
l'instance SQL Server courante et que tu as créé ton assembly avec un
niveau de security SAFE
Regarde la syntaxe de CREATE ASSEMBLY
Il y a trois niveaux pour PERMISSION_SET
SAFE
EXTERNAL_ACCESS
UNSAFE
Commence par faire un test avec EXTERNAL_ACCESS ou encore UNSAFE

Bien cordialement
Med Bouchenafa

"Clark [MVP CRM]" wrote in message
news:
Bonjour
J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.
var cmd = new SqlCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText >>> (@"select count(*) from Portfolios_Positions
pp
where comptetitreid = '" +
CompteTitreId + "' and datereference = '" +
mouvement.dateReference.AddDays(-1) + "'")
};
conn.Open();
var nbPos = (int)cmd.ExecuteScalar();
J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé d'accéder
à des données dont l'accès est restreint par l'assembly.
Après essais, il s'avère que ce sont les appels faits dans cette
procédure stockée à d'autres fonctions (sql ou clr) qui provoquent cette
erreur.
Y a t il un moyen de corriger ceci?
Merci








Avatar
Clark [MVP CRM]
Bonsoir
Désolé j'ai dit une bétise, j'avais mal lu le message d'erreur, c'était jute
un problème d'autorisation pour déployer en external_access ou unsafe. Ce
qui est réglé.
Par contre j'ai fait le test et le résultat est toujours le même...
Comprends pas là. Je pense que je vais redécomposer tout ça, mais là je n'ai
pas trop le temps et j'ai contourné le problème en attendant.

"Med Bouchenafa" a écrit dans le message de
news:
Je reste curieux de savoir comment tu as pu bloqué
EXTERNAL_ACCESS
UNSAFE

Le message d'erreur avait l#air d'etre clair mais lá je ne vois pas du
tout

Bien cordialement
Med Bouchenafa

"Clark [MVP CRM]" wrote in message
news:
Bonjour
Non pas d'accès externe, tout se passe bien sur la même instance et sur
la même base.
De plus, le déploiement external_access ou unsafe n'est pas authorisé sur
mon serveur.
Dans la procédure stockée que j'exécute, je fais un select sur différents
champs de ma base dont certains calculés par ces fonctions. Si j'enlève
les champs calculés, ça fonctionne mais avec, pas moyen.
"Med Bouchenafa" a écrit dans le message de
news:
Il est fort probable que ta procedure stockée fait un acces en dehors de
l'instance SQL Server courante et que tu as créé ton assembly avec un
niveau de security SAFE
Regarde la syntaxe de CREATE ASSEMBLY
Il y a trois niveaux pour PERMISSION_SET
SAFE
EXTERNAL_ACCESS
UNSAFE
Commence par faire un test avec EXTERNAL_ACCESS ou encore UNSAFE

Bien cordialement
Med Bouchenafa

"Clark [MVP CRM]" wrote in message
news:
Bonjour
J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.
var cmd = new SqlCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText >>>> (@"select count(*) from
Portfolios_Positions pp
where comptetitreid = '" +
CompteTitreId + "' and datereference = '" +
mouvement.dateReference.AddDays(-1) + "'")
};
conn.Open();
var nbPos = (int)cmd.ExecuteScalar();
J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé
d'accéder à des données dont l'accès est restreint par l'assembly.
Après essais, il s'avère que ce sont les appels faits dans cette
procédure stockée à d'autres fonctions (sql ou clr) qui provoquent
cette erreur.
Y a t il un moyen de corriger ceci?
Merci











Avatar
bruno reiter
Est-ce que ça change si tu mets des noms qualifiés ( schema.objet ) dans les
FROM de ta procédure?

BR

"Clark [MVP CRM]" wrote in message
news:
Bonjour
Non je n'ai pas donné le code de la procédure stockée, car il s'agit juste
d'un select avec appel à une fonction mais ça donne ça grosso modo

CREATE PROCEDURE [dbo].[CalculValoFromCompteAtDate]
@datePosition datetime,
@compteTitreId uniqueidentifier
AS

select SUM(case when coupon is not null then valo + coupon else valo end)
as total from
(select
Cumul2.Qty * Cumul2.Cotation * Cumul2.TauxChange as Valo
,dbo.fn_CalculCouponCouru(Cumul2.ValeurId, @datePosition) * Cumul2.Qty /
Cumul2.TauxChange as Coupon
From (
select
Cumul.ValeurId
,Cumul.Qty
,v.deviseCotationParDefaut
,dbo.[fn_GetLastCotationFromValeurAndDevise](v.ValeurId, @datePosition,
v.deviseCotationParDefaut) as Cotation
,dbo.[fn_GetLastCotationDateFromValeurAndDevise](v.ValeurId,
@datePosition, v.deviseCotationParDefaut) as DateCotation
,case
when c.Devise = v.deviseCotationParDefaut then 1
else dbo.fn_GetLastTauxChangeFromDevise(c.Devise,
@datePosition,v.deviseCotationParDefaut)
end as TauxChange
,case
when c.Devise = v.deviseCotationParDefaut then null
else dbo.fn_GetLastTauxChangeDateFromDevise(c.Devise,
@datePosition,v.deviseCotationParDefaut)
end as DateTauxChange
,c.Devise
from ( select
ValeurId, sum(Quantite) as Qty
from ( select case
when cott.SensAchatVente = 'V' then cots.QuantiteEnPartsEntieres * -1
when cott.SensAchatVente = 'A' then cots.QuantiteEnPartsEntieres
end as Quantite
,v.ValeurId
,v.LibelleLongValeur as LibelleValeur
from comptes_operationstitres cots
inner join Comptes_OperationsTitres_TypesOperationsSGP cott on
cots.IdTypeOperationSGP = cott.IdTypeOperationSGP
inner join valeurs v on cots.ValeurId = v.ValeurId
where CompteTitreId = @compteTitreId and DateReference <= @datePosition
and cots.Annule = 0) OpTitres
group by ValeurId, LibelleValeur
having sum(Quantite) <> 0) Cumul inner join Valeurs v on Cumul.ValeurId =
v.ValeurId
inner join Comptes c on c.CompteId = @compteTitreId
) Cumul2) Cumul3

J'avais utilisé d'abord des CTE mais je les ai enlevé, un info trouvé sur
le net, m'ayant laissé supposé que le problème venait de là mais sans
résultat.
Pour l'attribut [Microsoft.SqlServer.Server.SqlFunction(DataAccess =
DataAccessKind.Read)], je l'ai bien spécifié.
Merci
"Fred" a écrit dans le message de
news:%
"Clark [MVP CRM]" a écrit dans le message de
news:
Bonjour



Bonjour,

En complément de indications de Med Bouchenafa

J'ai créé une fonction sql clr en c#. Depuis celle-ci j'appelle une
procédure stockée standard.



Je ne vois pas de procédure stockée dans le code mais je ne pense pas que
tu puisses altérer les données dans une fonction crl (de même qu'on ne
peut apeler une procédure stockée dans une fonction sql)
Ce n'est pas le cas dans ton code cependant.

J'obtiens cette erreur
System.Data.SqlClient.SqlException: Cette instruction a essayé d'accéder
à des données dont l'accès est restreint par l'assembly.



j'ai mis un attribut sur la fonction dans un scénario analogue.
SqlFunctionAttribute avec le paramètre DataAccess à DataAccessKind.Read

(Je ne me souviens plus si cela fonctionnait sans et je ne peux tester
maintenant.)

--
Fred