Granting permission with the EXECUTE AS

Merhaba Arkadaşlar ,

Bu gün sizlere EXECUTE AS ile yetkilendirmeyi aktaracağım.  Örneklendirmemiz şunlar üzerinden gidecektir aslında ;

İki adet sp_ oluşturacağız ve bu sp_ lerin ikisi için bir kullanıcıya EXEC yetkisi vereceğiz.

Bu şekilde ikisi arasında ki farkı daha iyi görmüş olacağız .

Örneğimize geçmeden önce örneğimizi anlatacağımız tablolarımızı oluşturalım .

Önceden oluşturduğumuz test database ‘imiz üzerinde SQL_TÜRKİYE_1 adında tablo oluşturup içeirsine 1000 adet veri  basıyoruz.

-- Test tablomuzu oluşturuyoruz...
USE [test];
GO
CREATE TABLE [SQL_TÜRKİYE_1]
    (
      Id INT IDENTITY(1, 1) ,
      NAME VARCHAR(70) ,
      SURNAME VARCHAR(150) ,
      PHONE_NUMBER CHAR(11)
    );
-- Tablomuza 1000 adet veri basıyoruz ...
DECLARE @sayac INT;
SET @sayac = 1;
WHILE 1001 > @sayac
    BEGIN 
        INSERT  INTO SQL_TÜRKİYE_1
        VALUES  ( 'Yusuf' + ( CONVERT (VARCHAR(50), @sayac) ), 'KAHVECİ',
                  '05300000000' );
        SET @sayac = @sayac + 1;
    END; 
-- Tablomuza bastığımız verilerin sayısını kontrol ediyoruz... 
SELECT  COUNT(*)
FROM    SQL_TÜRKİYE_1;

 

Bu şekilde test tablomuzu oluşturmuş olduk . Şimdi örneğimize geçecek olursak .

İlk adım olarak örneğimizi gerşekleştireceğimiz kullanıcımızı oluşturuyoruz. Aşağıda ki script ile kullanıcımızı oluşturabiliriz :

-- sqltr adlı kullanıcısımızı oluşturuyoruz..
USE [master];
GO
CREATE LOGIN [sqltr] WITH PASSWORD=N'1', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
GO
USE [test];
GO
CREATE USER [sqltr] FOR LOGIN [sqltr];
GO

Daha sonra    sp_SQLTR1 adında bir sp_  oluşturacağız. Burada SQL_TÜRKİYE_1 tablosunda ki 100 kaydı SQL_TÜRKİYE_2 tablosuna basacağız.

-- SQLTR1 sp_ sini oluşturuyoruz.
CREATE PROCEDURE dbo.sp_SQLTR1
AS
    IF NOT EXISTS ( SELECT  *
                    FROM    sys.objects
                    WHERE   object_id = OBJECT_ID(N'[dbo].[SQL_TÜRKİYE_2]')
                            AND type IN ( N'U' ) )
        CREATE TABLE SQL_TÜRKİYE_2
            (
              Id INT IDENTITY(1, 1) ,
              NAME VARCHAR(70) ,
              SURNAME VARCHAR(150) ,
              PHONE_NUMBER CHAR(11)
            );
    INSERT  INTO SQL_TÜRKİYE_2
            SELECT TOP 100
                    NAME ,
                    SURNAME ,
                    PHONE_NUMBER
            FROM    [SQL_TÜRKİYE_1];

GO

Şimdi ise EXECUTE AS ‘li ikinci sp_ mizi oluşturuyoruz .

-- SQLTR2 sp_ sini oluşturuyoruz.
CREATE PROCEDURE dbo.sp_SQLTR2
    WITH EXECUTE AS OWNER
AS
    IF NOT EXISTS ( SELECT  *
                    FROM    sys.objects
                    WHERE   object_id = OBJECT_ID(N'[dbo].[SQL_TÜRKİYE_2]')
                            AND type IN ( N'U' ) )
        CREATE TABLE SQL_TÜRKİYE_2
            (
              Id INT IDENTITY(1, 1) ,
              NAME VARCHAR(70) ,
              SURNAME VARCHAR(150) ,
              PHONE_NUMBER CHAR(11)
            );
    INSERT  INTO [SQL_TÜRKİYE_2]
            SELECT TOP 100
                    NAME ,
                    SURNAME ,
                    PHONE_NUMBER
            FROM    dbo.[SQL_TÜRKİYE_1];

GO

Şu ana kadar iki adet sp ve bir kullanıcı oluşturmuş olduk . Şimdi oluşturduğumuz sp ‘leri çalıştırabilmesi için sqltr kullanıcımıza sp bazlı EXECUTE yetkisi verelim .

-- sp_SQLTR1 sp'sini çalıştırma yetkisi veriyoruz.
GRANT EXEC ON dbo.sp_SQLTR1 TO sqltr;
GO

--sp_SQLTR2 sp'sini çalıştırma yetkisi veriyoruz.
GRANT EXEC ON dbo.sp_SQLTR2 TO sqltr;
GO

Sqltr kullanıcımız ile sisteme login olalım .

1

Aşağıda da görüldüğü üzere sisteme başarılı bir şekilde giriş yapılmıştır .

2

Şimdi ise EXEC yetkisi verdiğimiz sp_ leri EXECUTE etmeye çalışalım .

Sp_SQLTR1 prosedürü için aşağıda ki script ‘i çalıştırdığımızda ;

--sp_SQLTR1 için ;
USE test;
GO
EXEC dbo.sp_SQLTR1;

Msg 262, Level 14, State 1, Procedure sp_SQLTR1, Line 5

CREATE TABLE permission denied in database ‘test’.

4

Yukarıda ki permission yani yetki hatası almaktayız . Prosedürün içerisinde tablo oluştururken yetki hatası ile karşılaşmaktayız.

Peki  Sp_SQLTR2 prosedürünü çalıştırdığımızda nasıl bir sonuçla karşılaşacağız acaba ?

--sp_SQLTR2 için ;
USE test;
GO
EXEC dbo.sp_SQLTR2;

Yukarıda ki scriptimizi çalıştırdığımızda aşağıda ki ekran görüntüsünde gördüğümüz üzere 100 adet kayıdımız SQL_TÜRKİYE_2 tablomuza eklenmiştir.

3

Peki neden sp_SQLTR1 ‘i EXECUTE ettiğimizde Permission hatası aldıkta ikincisinde almadık . İki prosedürümüzün içerisine baktığımızda aralarında ki tek farkın ‘WITH EXECUTE AS OWNER

’ olduğunu görmekteyiz.

Bu bize neyi ifade etmektedir peki  ?

SP ‘ye EXECUTE AS OWNER ekleme sonucu bu sp_ ‘yi EXECUTE edecek kullanıcı bu sp_ yi  kendi yetkileri ile değil Owner ‘ın yetkisi ile çalıştıracak demektir.

 

Aklınıza takılan soruları sorabilirsiniz.

Diğer makalelerimde görüşmek üzere …

Leave a Reply

Your email address will not be published. Required fields are marked *