SQL CLR: Funkcja z context connection=true kończy się błędem

30-Wrz-2018

Funkcja została zdefiniowana w dość prosty sposób:

 [SqlFunction(DataAccess = DataAccessKind.Read,
 SystemDataAccess = SystemDataAccessKind.Read)]
 public static int GetDBCount()
 {
 using (SqlConnection conn
 = new SqlConnection("context connection=true"))
 {
 conn.Open();
 SqlCommand cmd = new SqlCommand(
 "SELECT COUNT(*) AS 'NumberOfDatabases' FROM sys.databases", conn);
 return (int)cmd.ExecuteScalar();
 }
 }

Niestety jej wykonanie kończyło się błędem:

This statement has attempted to access data whose access is restricted by the assembly.

No cóż. DataAccess = DataAccessKind.Read był wprawdzie zdefiniowany, ale moja funkcja próbowała czytać z danych systemowych. W takim przypadku trzeba dodać: SystemDataAccess = SystemDataAccessKind.Read

Cała funkcja wygląda więc teraz tak:

[SqlFunction(DataAccess = DataAccessKind.Read,
SystemDataAccess = SystemDataAccessKind.Read)]
public static int GetDBCount()
{
using (SqlConnection conn
= new SqlConnection("context connection=true"))
{
conn.Open();
SqlCommand cmd = new SqlCommand(
"SELECT COUNT(*) AS 'NumberOfDatabases' FROM sys.databases", conn);
return (int)cmd.ExecuteScalar();
}
}

Pełną listę atrybutów dla SQL CLR można znaleźć tutaj

https://msdn.microsoft.com/pl-pl/en-en/library/ms131050

i jak widać, warto do niej zaglądać!

Dodaj komentarz:

Autor: Rafał Kraik