Obsługiwanych środowiska CLR
The Microsoft .NET Framework common language runtime (CLR) is an environment that executes many modern programming languages, including Microsoft Visual C#, Microsoft Visual Basic, and Microsoft Visual C++.CLR funkcje zebrane śmieci pamięci, pre-emptive wątków, usługi metadane (odbicia typu), verifiability kodu i zabezpieczenia dostępu kodu.Środowisko CLR używa metadane, aby zlokalizować i załadować klas, ułożyć wystąpień w pamięci, wywołania metoda rozwiązania, generowanie kodu macierzystego, wymuszenia zabezpieczeń i ustawić wykonywania-czas granice kontekstu.
Środowisko CLR i SQL Server różnią się w środowisku czas wykonywania w sposób ich obsługi pamięci, wątków i synchronizacji. W tym temacie opisano sposób, w którym te dwa razy wykonywania są zintegrowane tak, aby wszystkie zasoby systemu są zarządzane w jednolity sposób.W tym temacie omówiono także sposób, w których CLR kodu dostępu zabezpieczeń (CAS) i SQL Server Aby zapewnić środowisko niezawodne i bezpieczne wykonywanie kodu użytkownika są zintegrowane zabezpieczenia.
Podstawowe pojęcia dotyczące architektury CLR
W programie .NET Framework programistą zapisuje w języku wysokiego poziom, który implementuje klasy zdefiniowanie jego struktury (na przykład, pola lub właściwości klasy) i metod.Niektóre z tych metod może być statyczne funkcji.Kompilacji program tworzy plik o nazwie zawierający kod skompilowany w zestawie Microsoft pośrednie języka (MSIL) i listę zawierającą wszystkie odwołania do zestawów zależnych.
Uwaga
Zestawy są istotnym elementem w architekturze środowiska CLR.Są one jednostek w opakowaniu, wdrażania i tworzenie kodu aplikacji w programie .NET Framework w wersji.Korzystanie z zestawów można wdrażać kod aplikacji wewnątrz bazy danych i zapewniają jednolity sposób, aby administrować, tworzyć kopię zapasową i przywrócić pełną bazy danych aplikacji.
Manifest wirtualny plik dziennika zawiera metadane dotyczące wirtualny plik dziennika, opisujący wszystkie struktur, pól, właściwości, klas, relacje dziedziczenia, funkcje i metody zdefiniowane w programie.Manifest ustanawia tożsamości wirtualny plik dziennika, określa pliki wchodzące w skład wirtualny plik dziennika implementacji, określa typy i zasobów, wchodzących w skład wirtualny plik dziennika, itemizes kompilacji-czas zależności innych wirtualny plik dziennikaów i określa wirtualny plik dziennika uprawnień wymaganych dla wirtualny plik dziennika działać poprawnie.Ta informacje są używane w czasie wykonywania rozpoznać odwołania, wymusić zasady wiązanie wersja i sprawdzenia spójności zestawów załadowany.
Środowisko .NET Framework obsługuje atrybutów niestandardowych dla adnotowanie klas, właściwości, funkcji i metod z dodatkowymi informacjami, aplikacja może przechwycić metadane.Wszystkie kompilatory systemu .NET Framework zajmują te adnotacji bez interpretacji i zapisać je jako wirtualny plik dziennika metadane.Adnotacje te mogą być badane w taki sam sposób jak inne metadane.
Kod zarządzany jest MSIL wykonywane w środowisko CLR, a nie bezpośrednio przez system operacyjny.Kod zarządzany aplikacje uzyskują CLR usług, takich jak automatyczne usuwanie elementów bezużytecznych, czas wykonywania typu sprawdzania i pomocy technicznej w zakresie zabezpieczeń.Usługi te pomagają zachowanie jednolitego platformy i niezależny od języka aplikacji kod zarządzany.
Cele projektu z integracja CLR
Podczas wykonywania kodu użytkownika wewnątrz środowiska obsługiwane środowiska CLR w SQL Server (nazywany integracja CLR), zastosuj następujące cele projektu:
Niezawodność (bezpieczeństwo)
Kod użytkownika nie należy zezwolić na wykonywanie operacji, które naruszyć integralność procesu aparat bazy danych, takich jak popping okno komunikatu żądania odpowiedź użytkownika lub proces zamykania.Kod użytkownika nie powinna mieć należy zastąpić buforów pamięci aparat bazy danych lub wewnętrznych struktur danych.
Skalowalność
SQL Server and the CLR have different internal models for scheduling and memory management.SQL Server supports a cooperative, non-preemptive threading model in which the threads voluntarily yield execution periodically, or when they are waiting on locks or I/O.Środowisko CLR obsługuje preemptive modelu wątków.Jeśli uruchomiony kod użytkownika SQL Server bezpośrednio może wywołać wątków pierwotnych, system operacyjny, a następnie go nie integracji również w SQL Server Harmonogram zadań i może zmniejszyć skalowalność systemu. Środowisko CLR nie rozróżnia pamięci wirtualne i fizyczne, ale SQL Server bezpośrednio zarządza pamięci fizycznej i jest wymagany do używania pamięci fizycznej w określonym można konfigurować.
Różnych modelach wątków, planowanie i pamięci zarządzania obecne integracja wzywa do system zarządzania relacyjnymi bazami danych (RDBMS), który może obsługiwać tysiące sesji równoczesnych użytkowników.Architektura powinien zapewnić skalowalność systemu nie odczyta kod użytkownika bezpośrednio wywoływanie interfejsów programowania aplikacji (API) dla wątków, pamięci i pierwotnych synchronizacji.
Zabezpieczenia
Kod użytkownika w bazie danych muszą być zgodne z SQL Server zasady uwierzytelnianie i autoryzacja podczas uzyskiwania dostępu do bazy danych obiektów, takich jak tabele i kolumny. Ponadto administratorzy bazy danych należy możliwość kontrolowania dostępu do zasobów systemu operacyjnego, takie jak pliki i dostępu do sieci, z kodu użytkownika w bazie danych.Ta opcja stanie się ważne, jako zarządzane języków programowania (w przeciwieństwie do niezarządzanego języków, takich jak języka Transact-SQL) zapewnia interfejsy API w celu uzyskania dostępu do tych zasobów.W systemie musi zapewniają bezpieczny sposób dla kodu użytkownika na komputerze dostęp do zasobów poza Database Engine proces. Aby uzyskać więcej informacji zobaczŚrodowisko CLR Integracja z zabezpieczeniami.
Wydajność
Zarządzany kod użytkownika w Database Engine powinien mieć obliczeniowej porównywalne z tego samego kodu uruchamiać poza serwer. Dostęp do bazy danych z kodu zarządzanego użytkownika nie jest tak szybka jak macierzystego Transact-SQL. Aby uzyskać więcej informacji zobaczWydajność CLR integracja.
Środowisko CLR usług
Środowisko CLR udostępnia wiele usług w celu osiągnięcia celów projektu CLR integracja z SQL Server.
Typ kontroli bezpieczeństwa
Typ-kod zarządzany jest kodem, który uzyskuje dostęp do pamięci struktur tylko w sposób wyraźnie określone.Na przykład, biorąc pod uwagę odwołanie prawidłowego obiektu, typ-kod zarządzany mogą uzyskać dostęp do pamięci na stałe przesunięcia odpowiadający członkowie pole Rzeczywista.Niemniej jednak jeśli kod uzyskuje dostęp do pamięci pod adresem dowolnego przesunięcia lub poza zakresem pamięci, której należy obiekt, następnie nie jest typu palety.Kiedy zespoły są ładowane do środowiska CLR, przed MSIL są kompilowane za pomocą just-in-czas (JIT) kompilacji w czasie wykonywania wykonuje fazy weryfikacji, które sprawdza, czy kod w celu określenia jego typu bezpieczeństwa.Kod, który przekazuje pomyślnie weryfikacji jest nazywany kodem verifiably typu palety.
Domeny aplikacji
Środowisko CLR obsługuje pojęcia domen aplikacji za wykonanie strefy w ramach procesu hosta, w którym zestawów zawierających kod zarządzany zostanie załadowany i wykonany.Granic domen aplikacji zapewnia izolację między zespołów.Zestawy są izolowane z punktu widzenia widoczność zmienne statyczne i elementów członkowskich danych oraz możliwość wywoływać kod dynamicznie.Domeny aplikacji są także mechanizm ładowanie i zwalnianie kodu.Kod może być usunięte z pamięci tylko przez zwolnienie domena aplikacji.Aby uzyskać więcej informacji zobaczDomeny aplikacji i środowiska CLR Integracja z zabezpieczeniami.
Zabezpieczenia programu Access kodu (CAS)
System zabezpieczeń środowiska CLR pozwala kontrolować, jakie operacje wykonywane przez przypisanie uprawnień do kod zarządzany kodu.Uprawnienia dostępu do kodu są przypisywane oparta na tożsamości kod (na przykład podpis wirtualny plik dziennika) lub pochodzenia kod.
Środowisko CLR zawiera zasady dla całego komputera, które mogą być ustawione przez administratora komputera.Zasada ta określa dotacji uprawnień dla dowolnego kod zarządzany, uruchomionymi na komputerze.Ponadto nie ma zasad zabezpieczeń poziom hosta, które mogą być używane przez hosty takich jak SQL Server Aby określić dodatkowe ograniczenia kod zarządzany.
Jeśli zarządzany interfejsu API programu Microsoft .NET Framework udostępnia operacje dotyczące zasób, które są chronione przez uprawnienia dostępu do kodu, interfejs API zostanie popytu uprawnienie przed uzyskaniem dostępu do zasób.To zapotrzebowanie powoduje, że system zabezpieczeń środowiska CLR wyzwalać pełną kontrolę każdej jednostki kodu (zestawów) w stos wywołań.Tylko wtedy, gdy wywołanie cały łańcuch ma uprawnienia dostępu do zasób otrzyma.
Należy zauważyć, że możliwość generowania kod zarządzany dynamicznie, za pomocą interfejsu API Reflection.Emit, nie jest obsługiwany wewnątrz środowiska obsługiwane środowiska CLR w SQL Server. Taki kod nie będzie zawierało CAS uprawnień do uruchomienia i w związku z tym może nie działać w czasie wykonywania.Aby uzyskać więcej informacji zobaczZabezpieczenia programu Access CLR integracja kodu.
Atrybuty ochrony hostów (HPAs)
Środowisko CLR udostępnia mechanizm adnotacji zarządzane interfejsów API, które wchodzą w skład systemu .NET Framework z niektórych atrybutów, które mogą być przydatne do hosta do środowiska CLR.Przykładami takich atrybutów:
SharedState, która wskazuje, czy w interfejsie API udostępnia możliwość tworzenia i zarządzania stanem udostępnionego (na przykład klasy statycznej pola).
Synchronizacja, która wskazuje, czy w interfejsie API udostępnia możliwość wykonywania synchronizacji wątków.
ExternalProcessMgmt, która wskazuje, czy w interfejsie API opisuje sposób, aby kontrolować proces hosta.
Biorąc pod uwagę te atrybuty, hosta można określić listę HPAs, takie jak atrybut SharedState, które powinny być niedopuszczalne w obsługiwanym środowisku.W takim przypadek do środowiska CLR odrzuca prób przez kod użytkownika do wywoływania interfejsów API, które są odnotowany przez HPAs na liście zabronionych.Aby uzyskać więcej informacji zobaczAtrybuty ochrony hosta i integracja CLR Programowanie.
W jaki sposób program SQL Server i środowisko CLR praca razem
W tej części opisano, w jaki sposób SQL Server integruje wątków, planowanie, synchronizacja z modeli zarządzania pamięci SQL Server i środowiska CLR. In particular, this section examines the integration in light of scalability, reliability, and security goals.SQL Server essentially acts as the operating system for the CLR when it is hosted inside SQL Server.Środowisko CLR wywołuje procedury niskiego poziom implementowane przez SQL Server do zarządzania wątków, planowanie, synchronizacji i pamięci. Są to te same pierwotnych, pozostała część SQL Server używa aparatu. Takie rozwiązanie zapewnia kilka korzyści skalowalność, niezawodność i bezpieczeństwo.
Skalowalność: Wspólnych wątków, planowania i synchronizacji
Środowisko CLR wywołań SQL Server Interfejsy API do tworzenia wątków, zarówno dla uruchomionego kodu użytkownika oraz do swoich własnych wewnętrznego użyć. Aby zsynchronizować między wiele wątków, wymaga środowiska CLR SQL Server Synchronizacja obiektów. Pozwala to SQL Server harmonogram, aby zaplanować inne zadania, gdy wątek oczekuje na obiektu synchronizacji. Na przykład, gdy środowisko CLR inicjuje śmieci kolekcja, wszystkie jego wątki czekać na śmieci kolekcja do zakończenia.Ponieważ wątki środowiska CLR i czeka obiekty synchronizacji są znane SQL Server harmonogram, SQL Server można zaplanować wątków, które są uruchomione inne zadania bazy danych, niewymagające środowiska CLR. Umożliwia to także SQL Server wykrywać zakleszczenie, obejmujących blokady przez środowisko CLR synchronizacji obiektów i tradycyjnych technik zatrudnienie do usunięcia zakleszczenie.
Kod zarządzany jest uruchamiana preemptively w SQL Server. The SQL Server scheduler has the ability to wykrywać and stop threads that have not yielded for a significant amount of czas. Umożliwia spinanie CLR wątków SQL Server wątki oznacza, że SQL ServerHarmonogram można zidentyfikować "wykorzystał" wątki w środowiska CLR i zarządzać nimi ich priorytet. Takie wykorzystał wątki są zawieszone i ponownie umieścić w kolejce.Nie wolno wątków, które często są identyfikowane jako wątki wykorzystał uruchomienie w danym okresie czas, tak aby inni pracownicy wykonywania mogą być uruchamiane.
Uwaga
Długim kod zarządzany, który uzyskuje dostęp do danych lub za mało pamięci do wyzwalacza śmieci przydziela kolekcja da się automatycznie.Długim kod zarządzany, który nie uzyskać dostępu do danych lub przydzielić pamięci wystarczająco zarządzanych do wyzwalania usuwanie elementów bezużytecznych powinny jawnie produktywności przez wywołanie funkcja System.wątek.Sleep() systemu .NET Framework.
Skalowalność: Zarządzanie pamięci wspólnej
Wywołania CLR SQL Server proste kształty podziału i de-allocating jego pamięci. Because the memory used by the CLR is accounted for in the total memory usage of the system, SQL Server can stay within its configured memory limits and ensure the CLR and SQL Server are not competing with each other for memory.SQL Server can also reject CLR memory requests when system memory is constrained, and ask CLR to reduce its memory use when other tasks need memory.
Niezawodność: Domeny aplikacji i wyjątki nieodwracalny
Jeśli kod zarządzany w API systemu .NET Framework napotka krytyczne wyjątki, takie jak przepełnienia limitu pamięci lub stosu, nie zawsze jest możliwe takiej i zapewnia konsekwentne i prawidłowe semantyka do ich wykonania.Te interfejsy API podnosi wątek przerwać wyjątek w odpowiedzi na te błędy.
Jeśli w SQL Server, takie przerwanie wątek są obsługiwane w następujący sposób: środowisko CLR wykrywa dowolnego stanu udostępnionych domena aplikacji, w którym następuje przerwanie wątek. Środowisko CLR robi to, sprawdzając obecność obiektów synchronizacji.Jeśli domena aplikacji jest stan udostępnionego, a następnie jest zwalniany domeny aplikacji, sam.Zwolnienie domena aplikacji zatrzymuje transakcji w bazie danych, które są aktualnie uruchomione w tej domenie aplikacji.Ponieważ obecność udostępnionych stanu poszerzyć wpływ takich krytyczne wyjątki od sesji użytkownika innego niż jeden wyzwolenie wyjątku, SQL Server oraz środowiska CLR ma podjąć kroki w celu zmniejszenia prawdopodobieństwa stanu udostępnionego. Aby uzyskać więcej informacji zobacz dokumentację systemu .NET Framework.
Zabezpieczenia: Zestawów uprawnień
SQL Server Umożliwia określenie wymagań niezawodność i bezpieczeństwo dla kodu wdrożony w bazie danych.Gdy zespoły są przekazywane do bazy danych, autora wirtualny plik dziennika można określić jeden z trzech zestawów uprawnień dla tego wirtualny plik dziennika: BEZPIECZNE EXTERNAL_ACCESS i UNSAFE.
Zestaw uprawnień |
BEZPIECZNE |
EXTERNAL_ACCESS |
NIEBEZPIECZNE |
zabezpieczenia dostępu kodu |
Tylko do wykonywania |
wykonać + dostęp do zasobów zewnętrznych |
Bez ograniczeń |
Ograniczenia model programowania |
Tak |
Tak |
Bez ograniczeń |
Wymaganie verifiability |
Tak |
Tak |
Nie |
Zdolność do wywoływania kodu macierzystego |
Nie |
Nie |
Tak |
BEZPIECZNE jest najbardziej niezawodną i bezpieczną z ograniczeniami skojarzone z punktu widzenia dozwolonych modelu programowania.Zestawy awaryjny są wystarczająco dużo uprawnienie do uruchomienia, wykonywanie obliczeń i mieć dostęp do lokalnej bazy danych.Zespoły awaryjny konieczne jest wpisanie się verifiably bezpieczne i nie można wywoływać kod niezarządzany.
UNSAFE jest bardzo zaufanego kodu, które mogą być tworzone tylko przez administratorów bazy danych.Ten kod zaufanych ma żadnych ograniczeń zabezpieczeń kod dostępu i go może wywoływać kod niezarządzany (w trybie macierzystym).
EXTERNAL_ACCESS udostępnia opcję zabezpieczeń pośrednie, umożliwiając kodu dostępu do zasobów zewnętrznych do bazy danych, ale nadal występuje gwarancji niezawodności bezpieczne.
SQL Server używa warstwy zasad CAS poziomie hosta, aby skonfigurować zasadę hosta, która dotacji jednego z trzech zestawów uprawnień na podstawie uprawnienia ustawione przechowywanych w SQL Server katalogi. kod zarządzany uruchomiony w bazie danych zawsze pobiera jednego z tych zestawów uprawnień dostępu do kodu.
Ograniczenia model programowania
Model programowania kod zarządzany w SQL Server polega na pisaniu funkcje, procedury i typów, które zazwyczaj nie wymagają stosowania stanie się za pośrednictwem wielu wywołania lub udostępniania stanu w wielu sesji użytkownika. Co więcej zgodnie z wcześniejszym opisem obecność stan udostępnionego może spowodować, że krytyczne wyjątki, wpływ na skalowalność i niezawodność aplikacji.
Biorąc pod uwagę te zagadnienia, firma Microsoft zniechęcić stosowania statycznych zmiennych i danych statycznych członkowie klas w SQL Server. BEZPIECZNE i EXTERNAL_ACCESS zestawów, SQL Server sprawdza, czy metadane wirtualny plik dziennika w czasie CREATE MONTAŻOWYCH i kończy się niepowodzeniem do tworzenia takich zestawów, jeśli zostaną znalezione elementy danych statycznych i zmiennych.
SQL Server również nie zezwala na zaproszenia do systemu .NET Framework interfejsów API usługi, które są odnotowany z SharedState, Synchronization i ExternalProcessMgmt atrybuty ochrony hostów. Zapobiega to bezpieczne i zestawy EXTERNAL_ACCESS z wywołaniem żadnych interfejsów API włączyć udostępnianie stanu trwa synchronizacji i wpływ na spójność SQL Server proces. Aby uzyskać więcej informacji zobaczOgraniczenia dotyczące środowiska CLR model programowania integracja.