WYKONANIE klauzuli (Transact-SQL)

W SQL Server można zdefiniować kontekst wykonywania następujących modułów zdefiniowanych przez użytkownika: funkcje (wierszu tabela, z wyjątkiem-wycenione funkcji), procedur, kolejek i wyzwalaczy.

Określając kontekstu, w którym wykonywane jest moduł można kontrolować konto użytkownika, które Aparat baz danych używa do sprawdzania uprawnień do obiektów, które odwołuje się moduł.Zapewnia elastyczność i kontrolę w Zarządzanie uprawnieniami poprzez łańcuch obiektu, który istnieje między modułami zdefiniowane przez użytkownika i obiektów zawiera odwołanie do tych modułów.Muszą mieć uprawnienia dla użytkowników tylko w module, bez potrzeby udzielać im jawne uprawnienia do obiektów.Tylko moduł działa jako użytkownik musi mieć uprawnienia dla obiektów, dostęp do modułu.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

Functions (except inline table-valued functions), Stored Procedures, and DML Triggers
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' } 

DDL Triggers with Database Scope
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' } 

DDL Triggers with Server Scope and logon triggers
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' } 

Queues
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' } 

Argumenty

  • OBIEKT WYWOŁUJĄCY
    Określa, że instrukcje wewnątrz modułu są wykonywane w kontekście wywołującego modułu.Użytkownik wykonuje modułu trzeba mieć odpowiednie uprawnienia, nie tylko samego modułu, ale w żadnych obiektów bazy danych, do których odwołują się modułu.

    Obiekt WYWOŁUJĄCY jest domyślne dla wszystkich modułów, z wyjątkiem kolejek i jest taka sama jak SQL Server 2005 zachowanie.

    Obiekt WYWOŁUJĄCY nie można określić w tworzenia kolejki lub zmieniać kolejki instrukcja.

  • SELF
    WYKONANIE SELF AS jest równoważne EXECUTE jako user_name, w przypadku gdy określony użytkownik jest osobą, tworzenie lub zmienianie modułu.Identyfikator użytkownika rzeczywiste osobie, tworzenia lub modyfikowania modułów są przechowywane w execute_as_principal_id kolumna w sys.sql_modules lub sys.service_queues katalogu widoku.

    SELF jest domyślna dla kolejki.

    Ostrzeżenie

    Aby zmienić identyfikator użytkownika execute_as_principal_id w sys.service_queues katalogu widoku, należy jawnie określić jako ustawienie w KOLEJCE ALTER instrukcjaEXECUTE.

  • WŁAŚCICIEL
    Określa instrukcje wewnątrz modułu jest wykonywany w kontekście bieżącego właściciela modułu.Jeśli moduł nie ma określonego właściciela, właściciel schematu moduł jest używany.Nie można określić właściciela Wyzwalacze DDL lub logowania.

    Ważna informacjaWażne:

    WŁAŚCICIEL musi być mapowane na konto singleton i nie może być roli lub grupy.

  • 'user_name'
    Określa instrukcje wewnątrz modułu wykonać w kontekście użytkownika określonego w user_name.Sprawdzane są uprawnienia dla obiektów w module user_name.user_name nie można określić dla Wyzwalacze DDL z serwera, zakres lub wyzwalaczy logowania.Użycie login_name zamiast.

    user_namemusi istnieć w bieżącej bazie danych i musi być kontem singleton.user_namenie może być grupy, roli, certyfikat, kluczlub wbudowane konto, takie jak NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService lub NT AUTHORITY\LocalSystem.

    Identyfikator użytkownika, w kontekście wykonywania jest przechowywany w metadane i mogą być wyświetlane w execute_as_principal_id kolumna w sys.sql_modules lub sys.assembly_modules katalogu widoku.

  • 'login_name'
    Określa instrukcje wewnątrz modułu wykonać w kontekście SQL Server logowania określony w login_name.Sprawdzane są uprawnienia dla obiektów w module login_name.login_name można określić tylko dla Wyzwalacze DDL z serwera, zakres lub wyzwalaczy logowania.

    login_namenie może być grupy, roli, certyfikat, kluczlub wbudowane konto, takie jak NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService lub NT AUTHORITY\LocalSystem.

Uwagi

Jak Aparat baz danych oblicza uprawnienia do obiektów, do których istnieją odwołania w module zależy od łańcuch własności między wywołaniem obiekty i obiekty odwołanie.W starszych wersjach SQL Server, tworzenie łańcucha własności był tylko metoda dostępne w celu uniknięcia konieczności użytkownikowi wywołującego dostęp do wszystkich obiektów odwołanie.

Tworzenie łańcucha własności ma następujące ograniczenia:

  • Stosuje się tylko do DML instrukcji: Wybierz, wstawianie, AKTUALIZOWANIE i usuwanie.

  • Właściciele wywołujący i obiektów o nazwie musi być taka sama.

  • Nie ma zastosowania do kwerend dynamicznych wewnątrz modułu.

Aby uzyskać więcej informacji na temat Tworzenie łańcucha własności, zobacz Łańcuchy własności.

Niezależnie od kontekstu wykonanie określonej w module zawsze stosować następujące działania:

  • Gdy moduł jest wykonywane, Aparat baz danych najpierw sprawdza, czy użytkownik wykonywania moduł ma uprawnienie EXECUTE modułu.

  • Stosuje się nadal zasady łańcucha własności.Oznacza to, jeśli właścicieli obiektów wywołujących i nazywane są takie same, uprawnienia nie są sprawdzane obiektów podstawowych.

Gdy użytkownik wykonuje moduł, który został określony na uruchomienie w kontekście innych niż WYWOŁUJĄCY, uprawnienia użytkownika do wykonać moduł jest zaznaczone, ale dodatkowe uprawnienia dla obiektów, które są dostępne przez moduł są sprawdzane przed konta użytkownika określonego w jako EXECUTE klauzula.Użytkownik wykonywania moduł jest w efekcie określony użytkownik.

Kontekst określone w wykonywanie jak klauzula moduł jest ważny tylko czas realizacji modułu.Przywraca kontekst rozmówcy po zakończeniu wykonywania moduł.Aby uzyskać więcej informacji na temat przełączania kontekstu wykonania w module, zobacz Używając jako wykonywanie modułów.

Określając nazwę logowania użytkownika lub

Identyfikator użytkownika lub serwer logowania bazy danych określonej w wykonywanie nie UPUSZCZANYCH klauzula modułu, dopóki moduł została zmodyfikowana tak, aby wykonać w innym kontekście.

Nazwa użytkownika lub logowania określony w EXECUTE AS klauzula musi istnieć jako główny zobowiązany w sys.database_principals lub sys.server_principals, odpowiednio, lub inna tworzenia lub zmiany modułu operacja kończy się niepowodzeniem.Ponadto użytkownik tworzy lub zmienia moduł musi mieć uprawnienia PERSONIFIKUJ kapitału.

Jeśli użytkownik ma niejawna dostęp do bazy danych lub wystąpienie SQL Server poprzez członkostwo grupy systemu Windows użytkownik określił w wykonywanie jak klauzula jest tworzone niejawnie podczas tworzenia modułu kiedy istnieje jeden z następujących wymogów:

  • Określonego użytkownika lub logowania jest elementem element członkowski sysadmin stała rola serwera.

  • Użytkownik, który tworzy moduł ma uprawnienie do tworzenia podmiotów.

Jeśli żadna z tych wymagań nie zostaną spełnione, operacja tworzenia modułu nie powiedzie się.

Ważna informacjaWażne:

Jeśli SQL Server (MSSQLSERVER), usługa jest uruchomiona jako lokalnego konta ( usługa lokalna lub lokalnego konta użytkownika), nie ma uprawnień do uzyskania członkostwa grupy konta domena systemu Windows, określonego w jako EXECUTE klauzula.Spowoduje to wykonanie modułu nie powiedzie się.

Załóżmy na przykład, następujące warunki:

  • CompanyDomain\SQLUsers grupa ma dostęp do Sprzedaż bazy danych.

  • CompanyDomain\SqlUser1 jest elementem element członkowski SQLUsers i dlatego ma dostęp do Sprzedaż bazy danych.

  • Użytkownik, który jest tworzenie lub zmienianie modułu ma uprawnienia do tworzenia podmiotów.

Gdy następujące CREATE PROCEDURE instrukcja jest uruchamiana, CompanyDomain\SqlUser1 jest niejawnie tworzonymi jako bazy danych głównych w Sales bazy danych.

USE Sales;
GO
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'CompanyDomain\SqlUser1'
AS
SELECT user_name();
GO

Za pomocą WYWOŁUJĄCEGO jako wykonywanie instrukcji autonomiczny

Za pomocą wykonanie WYWOŁUJĄCEGO jako autonomiczne instrukcja wewnątrz modułu, aby zestaw kontekstu wykonania do wywołującego modułu.

Przyjęto następującą procedura składowana jest wywoływana przez SqlUser2.

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS 'SqlUser1'
AS
SELECT user_name(); -- Shows execution context is set to SqlUser1.
EXECUTE AS CALLER;
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the module.
REVERT;
SELECT user_name(); -- Shows execution context is set to SqlUser1.
GO

Za pomocą jako EXECUTE do definiowania niestandardowych zestawów uprawnień

Określenie kontekstu wykonania dla modułu mogą być bardzo użyteczne, gdy chcesz zdefiniować uprawnienia niestandardowe ustawienie.Na przykład niektóre akcje, takie jak OBCIĄĆ tabelę uprawnień grantable.Dołączanie OBCIĄĆ tabelę instrukcja w module i określając tego modułu wykonać jako użytkownik, który ma uprawnienia do modyfikowania tabela, można rozszerzyć uprawnienia obciąć tabela do użytkownika, któremu udzielasz uprawnienia wykonywania w module.Aby uzyskać więcej informacji, zobacz Aby utworzyć niestandardowe zestawy uprawnień przy użyciu jako wykonywanie.

Aby wyświetlić definicję modułu w kontekście wykonania określonego, użyj sys.sql_modules (języka Transact-SQL) wykazu widoku.

W trosce o

Określ identyfikator logowania lub użytkownika, który ma co najmniej uprawnienia wymagane do wykonywania operacji zdefiniowanych w module.Na przykład nie należy określać konto właściciela bazy danych, chyba że te uprawnienia są wymagane.

Uprawnienia

wykonać modułu określane jako EXECUTE obiekt wywołujący musi mieć uprawnienia wykonywania w module.

wykonać modułu CLR określonego z EXECUTE, uzyskuje dostęp do zasobów w innej bazie danych lub serwera, miejsce docelowe bazy danych lub serwera musi ufać wystawca uwierzytelnienia bazy danych, z którego modułu pochodzi ( źródło bazy danych).Aby uzyskać więcej informacji dotyczących ustanawiania zaufania wystawca uwierzytelnienia , zobacz Rozszerzanie bazy danych personifikacji przy użyciu jako EXECUTE.

Aby określić, jak wykonywanie klauzula podczas tworzenia lub modyfikowania moduł musi mieć uprawnienia PERSONIFIKUJ określonego głównego zobowiązanego, a także uprawnienia do tworzenia modułu.Zawsze może personifikować użytkownika.Określony kontekst nie wykonanie lub określony wykonanie WYWOŁUJĄCEGO jako, nie są wymagane uprawnienia PERSONIFIKUJ.

Aby określić login_name lub user_name zawierającego niejawna dostępu do bazy danych za pomocą członkostwa grupy systemu Windows, trzeba mieć uprawnienia kontroli w bazie danych.

Przykłady

Poniższy przykład tworzy procedura składowana i przypisuje kontekst wykonywania do OWNER.

USE AdventureWorks2008R2;
GO
CREATE PROCEDURE HumanResources.uspEmployeesInDepartment 
@DeptValue int
WITH EXECUTE AS OWNER
AS
    SET NOCOUNT ON;
    SELECT e.BusinessEntityID, c.LastName, c.FirstName, e.JobTitle
    FROM Person.Person AS c 
    INNER JOIN HumanResources.Employee AS e
        ON c.BusinessEntityID = e.BusinessEntityID
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh
        ON e.BusinessEntityID = edh.BusinessEntityID
    WHERE edh.DepartmentID = @DeptValue
    ORDER BY c.LastName, c.FirstName;
GO

-- Execute the stored procedure by specifying department 5.
EXECUTE HumanResources.uspEmployeesInDepartment 5;
GO