Recent comments

İçerik Ara



Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2011
Takvim
<<  May 2012  >>
MoTuWeThFrSaSu
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910
Keywords

SQL Server 2011 Denali ile beraber gelen yeni objeler sayesinde bir T-SQL komutunun ya da SP,view gibi objelerin çalıştırıldığı zaman döndüreceği kolonların listesini ve veri tiplerini almak mümkün. Ayrıca gene bu objeleri, bir TSQL script içerisindeki parametrelerin tiplerini öğrenmek için de kullanabiliriz.

More...

Stored Procedure(SP) ilk çalıştırıldığı zaman istatistikler göz önüne alınarak Query Optimizer tarafından en optimum Query Plan oluşturulur ve daha sonra kullanılmak üzere Plan Cache’e konulur. Aynı SP farklı bir zamanda tekrar çalıştırıldığında Cache’deki plan’ın geçerliliği kontrol edilir ve eğer plan geçerli yani güncel ise tekrar Query Plan oluşturulmak için zaman harcanmayıp plan Cache’den çağırılır ve kullanılır.

Query Plan oluşturma işlemi bazı durumlarda çok fazla CPU kaynağı tükettiği için bu şekilde bir cache’lenme mekanizması kullanılır. Fakat bazı durumlarda cache’lenen plan güncelliğini yitirmiş olabilir. Örneğin SP içinde geçen bir tabloda plan cache’lendikten sonra çok fazla data değişimi olduysa bu durumda istatistikler güncelliğini yitirecek dolayısıyla da cache’lenen plan güncelliğini yitirecektir. Ya da SP’nin içinde geçen tablolarda index ekleme,silme gibi DDL (Data Definition Language) değişiklikleri yapılırsa yine cache’lenen plan güncelliğini yitirmiş olacaktır. Böyle bir durumda SP’nin yeniden derlenip yeni bir Query Plan’ın oluşturulması gerekmektedir. İşte bu duruma ReCompilation denilmektedir.

More...

Bildiğiniz gibi LinkedServer tanımlayarak A server’ı üzerinden B Server’ında select,update gibi işlemleri yapabilmemiz mümkün.

Bugün anlatacağım OpenDataSource komutu ile linked server’a gerek kalmadan bu işlemleri nasıl yapabileceğimizi görüyor olacağız.

More...

SP ve Function’lar gibi bir çok yerde kullanılmakta olan bir tablom var ve ben bu tabloda kolon ekleme ya da silme gibi structure değişikliği yapmak istiyorum. Değişikliği yapmadan önce hangi objeler bu tablomu kullanıyor bilmeliyim ki sistemi nasıl etkileyeceğimi kestirebileyim.Ya da tanımladığım bir user-defined datatype’ım var. Bu datatype’ta değişiklik yapmak istiyorum ama hangi objeler bu datatype’ı kullanıyor öğrenmek istiyorum.

Bugünkü makalemde bu sorularımıza cevap bulmak için SQL Server’da Dependency sorgularının DMV’ler ile nasıl yapıldığına bakıyor olacağız.

More...

SQL Server execute edilen procedure, trigger ya da adhoc query’ler için oluşturduğu Query Plan’larını saklar ve daha sonraki kullanımlarda bu query plan’ları kullanarak işlemin daha hızlı sonuçlanmasını sağlar.

sys.dm_exec_cached_plans DMV’si ile bu saklanan Query Plan’larını sorgulayabilir, hangi obje için oluşturulduğunu, query plan’ın ne olduğunu, bu query plan’ın kaç defa kullanıldığını ve memory’de ne kadar yer kapladığını öğrenebiliriz.

More...

sys.dm_exec_query_stats ile Query İstatistikleri yazımda Database Engine’in çalıştırdığı bütün query’lerinin kaynak tüketimi açısından nasıl analiz edilip kötü yazılmış query’lerin bulunabileceğinden bahsetmiştik. Bugünkü yazımda ise aynı performans kontrollerinin Stored Procedure’ler üzerinde nasıl yapılacağına bakıyor olacağız.

Stored Procedure’lerin istatistiklerini incelemek için sys.dm_exec_procedure_stats DMV’sini kullanacağız. Bu DMV ile CPU, IO gibi değerler üzerinden SP’lerin kaynak tüketimine bakabileceğimiz gibi aynı zamanda kullanılmayan SP’leride analiz edebileceğiz.

More...

Bugün size bir çoğumuzun bilip hali hazırda kullanmakta olduğunu düşündüğüm bir konudan bahsetmek istiyorum. Belki hala bu özelliği kullanmayan vardır diyerek konuya giriyorum.

Bugünkü konumuz SQL Server Management Studio Object Explorer da bulunan filter özelliği.

More...

http://www.turgaysahtiyan.com/post/SQL-Server-e28093-SP%28Stored-Procedure%29-lere-Topluca-Yetki-Verme.aspx adresindeki yazımda Stored Procedure lere topluca nasıl yetki verilebileceğini anlatmıştım. Şimdi ise geçenlerde yazdığım bir başka SP den bahsedeğim. Bu SP ile sadece SP lere değil server da ki tüm objelere (table,function,view vs) topluca yetki verebilirsiniz.

SP şu şekilde.

CREATE PROC GivePermissionForAllObjects
	@UserName varchar(max) = '' --Yetki verilmek istenen user ya da role
	,@Databases varchar(Max) = '' --Yetki verilmek istenen DB ya da DB ler, Boş bırakılırsa bütün DB ler
	,@GrantDeny varchar(Max) = 'DENY' --GRANT, DENY, REVOKE
	,@PermissionType varchar(Max) = 'EXECUTE' --Alter, Execute, View Definition vs.
	,@ObjectType varchar(2)='' --SP,View,Function vs.
AS
if (isnull(@ObjectType,'')='') or (isnull(@ObjectType,'')='?') begin
print '
--Object Types
--FN	SQL_SCALAR_FUNCTION
--C 	CHECK_CONSTRAINT
--UQ	UNIQUE_CONSTRAINT
--SQ	SERVICE_QUEUE
--U 	USER_TABLE
--D 	DEFAULT_CONSTRAINT
--PK	PRIMARY_KEY_CONSTRAINT
--V 	VIEW
--S 	SYSTEM_TABLE
--IT	INTERNAL_TABLE
--P 	SQL_STORED_PROCEDURE
--TF	SQL_TABLE_VALUED_FUNCTION
--TR	SQL_TRIGGER
--PC	CLR_STORED_PROCEDURE
--
'
Return
end
SET NOCOUNT ON
--variables
declare @DatabasesTmp varchar(max)=@Databases
declare @DBName sysname,@ProcName sysname,@SchemaName sysname
declare @sql varchar(max)
Declare @Tbl_DB Table(DB varchar(Max))
Create Table ##Prodecures(DBName sysname, ProcName sysname, SchemaName sysname)
--

--Split Databases
if @DatabasesTmp<>'' begin
	while @DatabasesTmp <> '' begin
		if CHARINDEX(',',@DatabasesTmp)>0 begin
			insert @Tbl_DB select SUBSTRING(@DatabasesTmp,1,CHARINDEX(',',@DatabasesTmp)-1)
			set @DatabasesTmp = SUBSTRING(@DatabasesTmp,CHARINDEX(',',@DatabasesTmp)+1,LEN(@DatabasesTmp))
		end else begin
			insert @Tbl_DB select @DatabasesTmp
			set @DatabasesTmp = ''
		end
	end
end else begin
	insert @Tbl_DB select name from sys.databases where database_id>4
end
--

--code
declare CursorX cursor for 
select DB from @Tbl_DB
open Cursorx
fetch from Cursorx into @DBName
while @@FETCH_STATUS=0
begin
	set @sql = 'Use ' +@DBName + '; '+CHAR(10)+'
		insert ##Prodecures
		select '''+@DBName+''',name,SCHEMA_NAME(schema_id) from sys.objects where type='''+@ObjectType+''' '
	exec(@sql)
	fetch next from Cursorx into @DBName	
end
close Cursorx
deallocate Cursorx

declare CursorY cursor for 
select DBName,ProcName,SchemaName from ##Prodecures
open CursorY
fetch from CursorY into @DBName,@ProcName,@SchemaName
while @@FETCH_STATUS=0
begin
	set @sql = 'use ['+ @DBName + ']; ' +
		@GrantDeny+' '+@PermissionType+' ON ['+@SchemaName+'].['+@ProcName+'] TO ['+@UserName+'] AS [dbo]; '
	exec(@sql)
  fetch next from CursorY into @DBName, @ProcName, @SchemaName
end
close CursorY
deallocate CursorY

Drop Table ##Prodecures

SET NOCOUNT OFF
--code

 

Object Type için kullanılabilecek parametreler aşağıdaki gibidir.

FN SQL_SCALAR_FUNCTION
C CHECK_CONSTRAINT
UQ UNIQUE_CONSTRAINT
SQ SERVICE_QUEUE
U USER_TABLE
D DEFAULT_CONSTRAINT
PK PRIMARY_KEY_CONSTRAINT
V VIEW
S SYSTEM_TABLE
IT INTERNAL_TABLE
P SQL_STORED_PROCEDURE
TF SQL_TABLE_VALUED_FUNCTION
TR SQL_TRIGGER
PC CLR_STORED_PROCEDURE

 

Bir kaç örnek vermek gerekirse;

turgay user ına bütün AdventureWorks ve AdventureWorks2008 DB lerinde ki bütün table lar için SELECT yetkisi vermek.

exec GivePermissionForAllObjects 'turgay','AdventureWorks,AdventureWorks2008','GRANT','SELECT','U'

 

turgay user ıne bütün DB lerde ki Stored Procedure ler için EXECUTE yetkisi vermek.

exec GivePermissionForAllObjects 'turgay','','GRANT','EXECUTE','P'

 

turgay user ına bütün DB lerde verilmiş View SELECT hakkını geri almak. (REVOKE)

exec GivePermissionForAllObjects 'turgay','','REVOKE','SELECT','V'

 

turgay user ı bütün DB lerde Sistem Table larını Inherit alsa dahi SELECT çekemesin

exec GivePermissionForAllObjects 'turgay','','DENY','SELECT','S'

 

Bu şekilde istediğiniz DB de ki objelere topluca yetki verebilir yada geri alabilirsiniz.

 

İyi çalışmalar.

Geçenlerde yazmış olduğum bir SP yi sizinle paylaşmak istiyorum.

SP nin yaptığı iş, çok fazla sayıda DB içeren bir server da verdiğiniz kelimeyi SP name lerinde arayıp hangi DB lerde bu isme uyan SP ler varsa bunları listelemek.

CREATE PROC SearchSPsByName 
    @NameLike varchar(max) 
AS 

declare @DBName sysname,@sql varchar(max) 
create table ##TblResult(DBName sysname,SPName sysname) 

declare CursorX cursor for 
select name from sys.databases where database_id>4 
open Cursorx 
fetch from Cursorx into @DBName 
while @@FETCH_STATUS=0 
begin 
    set @sql = 'insert ##TblResult 
        select '''+@DBName+''',name from '+@DBName+'.sys.procedures where name like '''+@NameLike+''' ' 
    exec(@sql) 
    fetch next from Cursorx into @DBName    
end 
close Cursorx 
deallocate Cursorx 

select * from ##TblResult 

drop table ##TBlResult 
-- 

GO 

--Kullanımı

exec INTERFACE.dbo.SearchSPsByName 'CAD_RECONCIL_INTERFACE_PREPARE_REPORTS'

 

Kolay gelsin.

Merhaba arkadaşlar,

Bu yazımda SQL Server da Stored Procedure kullanımından bahsedeceğim.

Projelerimizde bazı sık kullandığımız işlem yapan sql cümlelerini stored procedure yapmamızda fayda var. Bu şekilde bu sql cümlesini projenin bir çok yerinde kullanmaktansa yazdığımız stored procedure ü kullanabiliriz ve herhangi bir değişiklikte kodun tamamını değiştirmektense sadece stored procedure u değiştiririz.

Mesela bir finans uygulamamız olduğunu düşünelim. Sisteme fatura girildiği zaman başka bir özet tabloya ilgili cari için borç-alacak kayıtlarını stored procedure ile oluşturabiliriz. Bu şekilde kodumuzun birden çok yerinde fatura oluşturma işlemi varsa biz bunların hepsini stored procedure ile halledebiliriz.

Şimdi örnek bir stored procedure yazalım. Çalışma alanı olarak pubs kataloğunu kullanalım. Örneğimiz de job_id si verilen job u kopyalayarak yeni bir job yapalım ve yeni job un id sini döndürelim. Reel hayatta bunu fatura kopyalama olarak düşünebilirsiniz.

Açıklamaları sql kodda vermeye çalıştım. Buyrunuz.

Stored Procedure:

/*Job2Job stored procedure ün adı*/
/*Job2Job sistemde varsa drop ediyoruz.*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Job2Job]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[Job2Job]
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
/*Job2Job u create ediyoruz.*/
/*@JobID_Source - Kopyalamak istediğimiz job un id si*/
/*@JobID_Dest - Yeni oluşan job un id si. Bunu output ile alıyoruz.*/
CREATE Procedure dbo.Job2Job @JobID_Source int , @JobID_Dest int OUTPUT
/*with enc ile kodumuzu saklıyoruz.*/
/*artık kodumuz enterprise dan girilip bakılmaya çalışıldığında gözükmeyecektir*/
With Encryption
as set nocount on begin tran  
  /*insert işlemi*/
  insert jobs
    select job_desc,min_lvl,max_lvl from jobs where job_id=@JobID_Source
  /*insert ten sonra job kataloğunda ki en son numara yeni oluşan job un id sidir.*/
  set @JobID_Dest=IDENT_CURRENT('Jobs')
commit tran
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Kullanımı ise şu şekilde:

declare @JobID_Dest int
select @JobID_Dest=0
exec dbo.Job2Job 1,@JobID_Dest output
select @JobID_Dest

Sormak istediğiniz bir şey olursa yorum kısmını kullanabilirsiniz.

Kolay gelsin

Turgay Sahtiyan