Recent comments

None


İç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-2013
Takvim
<<  Haziran 2017  >>
PaSaÇaPeCuCuPa
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
Keywords

SQL Server 2008 Management Studio Object Explorer da Table a sağ tıkladığımızda aşağıdaki gibi bir ekranla karşılaşırız.

er1

Bu ekranı kullanarak Select yada Edit işlemi yapmak istediğinizde Top 1000 ve 200 rakamları ile sınırlı kalınmaktadır.

Bazı durumlarda bu rakamlar az gelmektedir. Peki bu rakamları nereden değiştirebiliriz.

Management Studio da Tools >> Options menüsünü açalım.

Gelen ekrande SQL Server Object Explorer ekranını açtığınızda bu değerleri değiştireceğiniz yerlere görecekseniz.

er2

Değişiklikleri yapıp Ok e basarsanız artık yeni rakamlarla Select ve Edit yapabilirsiniz.

er3

İyi çalışmalar

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server da Database Backup Restore ünden sonra bu database de kullanılan userlar orphant duruma gelmektedir.

Bunun sebebi userların SID uyuşmazlığıdır.

İş arkadaşım Kadir Evciler in yazdığı aşağıdaki script userların SID lerini ayarlayıp orphant lığını kaldırmakta.

create table #temp(UserName varchar(100),UserSID varbinary(85));
insert into #temp exec sp_change_users_login 'Report'
declare ACur cursor for
select UserName from #temp 
open ACur
declare @userName varchar(50)
fetch from ACur into @userName
while @@FETCH_STATUS=0
begin
exec sp_change_users_login 'Update_One',@userName,@userName
fetch next from ACur into @userName
end
close ACur
deallocate Acur

 

Kolay gelsin.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


TempDB System Database nin file larını taşımak normal User DB lerini taşımaktan farklıdır.

Normal User DB leri Backup-Restore veya Detach-Attach komutları ile taşınabiliyorken TempDB Database File ları bu yöntem ile taşınamaz.

Böyle bir taşıma için aşağıdaki script i kullanabilirsiniz.

USE master
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = tempdev, FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TempDBFiles\Data\tempdb.mdf')
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = tmpf2, FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TempDBFiles\Data\tmpf2.ndf')
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = tmpf3, FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TempDBFiles\Data\tmpf3.ndf')
GO
ALTER DATABASE tempdb 
	MODIFY FILE (NAME = templog, FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TempDBFiles\Data\templog.ldf') 

 

Taşıma işleminden sonra SQL Service ini restart etmeniz yeterli olacaktır.

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Çok kullanıcılı sistemlerde standart yetkilerin üstüne bazı özel yetkiler vermemiz gerekebilir. Örneğin bazı user lara bazı SP veya Table lar için özel yetkiler verebiliriz.

User sayısı ve DB sayısı arttıkça bu role leri manage etmek oldukça zorlaşacaktır.

Geçenlerde yazdığım aşağıdaki Script vasıtasıyla kime hangi özel yetkileri verdiğinizi sorgulayabilirsiniz.

İşinize yaraması ümidiyle.

--paramaters
declare @Databases varchar(Max)='', –- istediğiniz DB ler için araştırma yapabilirsiniz.
		@GranteeUserName varchar(100)='', –- Hangi userların yetkisine bakmak istiyorsunuz?
		@GrantorUserName varchar(100)='dbo', – Hangi user ın verdiği yetkilere bakmak istiyorsunuz?
		@ObjectName varchar(100)='' –Hangi obje için verilmiş yetkilere bakmak istiyorsunuz?
--
--variables
declare @sql varchar(max)=''
declare @DBName varchar(MAx)
declare @DatabasesTmp varchar(max)=@Databases
Declare @Tbl_DB Table(DB varchar(Max))
Create Table ##DB_Permissions(DBName sysname,Obj_id int,ObjSchemaName sysname,Obj_Name sysname,UserID int
	,UserName sysname,state_desc nvarchar(60),permission_name nvarchar(128))
--
--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=
		'insert ##DB_Permissions ' + CHAR(10) +
		'select '''+@DBName+''',b.object_id as Obj_id,d.[name] as ObjSchemaName,b.[name] as Obj_Name ' + CHAR(10) +
		'	,grantee_principal_id as UserID,c.[name] as UserName,a.[state_desc],a.[permission_name] ' + CHAR(10) +
		'from ['+@DBName+'].sys.database_permissions A ' + CHAR(10) +
		'JOIN ['+@DBName+'].[sys].[objects] b ON A.major_id = B.object_id ' + CHAR(10) +
		'JOIN ['+@DBName+'].[sys].[database_principals] c ON grantee_principal_id = c.principal_id ' + CHAR(10) +
		'JOIN ['+@DBName+'].[sys].[database_principals] c2 ON grantor_principal_id = c2.principal_id ' + CHAR(10) +
		'JOIN ['+@DBName+'].sys.schemas d ON b.schema_id = d.schema_id ' + CHAR(10) +
		'where ((isnull('''+@GranteeUserName+''','''')='''') or (c.name='''+@GranteeUserName+''')) ' + CHAR(10) +
		'  and ((isnull('''+@GrantorUserName+''','''')='''') or (c2.name='''+@GrantorUserName+''')) ' + CHAR(10) +
		'  and ((isnull('''+@ObjectName+''','''')='''') or (b.name='''+@ObjectName+''')) '
	--print @sql
	exec(@sql)
	fetch next from Cursorx into @DBName
end
close Cursorx
deallocate Cursorx

select * from ##DB_Permissions

drop table ##DB_Permissions
--

 

Örnek Çıktı

dp

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Ortamınızda bir serverdaki DB lerin tamamını yeni bir server a taşımanız gerekebilir. Örneğin Production ortamındaki DB leri alıp Test ortamına atmak isteyebilirsiniz.

Bu durumda DB leri taşıdıktan sonra userları taşımalı aynı zamanda orphand olanlarıda düzeltmeniz lazım.

User sayınız az ise ve şifrelerini biliyorsanız problem yok. Peki ama ya user ların şifrelerini bilmiyorsanız?

İşte böyle bir durumda aşağıdaki scripti eski ortamınızda çalıştırıp ürettiği sonucu alıp yeni ortamda execute ediyorsunuz. Yeni ortamınızda da loginleriniz kullanıma hazır hale geliyor.

Parametreler :

  • @Databases : Hangi DB lere ait user role lerini taşımak istediğinizi seçiyorsunuz.
  • @list : Hangi user ları taşımak istediğinizi seçiyorsunuz.

Script:

-- Usage
-- Populate @Databases variable below with database(s),comma delimited list to script.
--    see section DATABASE LIST HERE
-- Populate @list variable below with account(s),comma delimited list to script.
--    see section USER LIST HERE
-- Save output to recreate:Login,Default DB,Server Roles,DB Access,DB Roles,DB Object Permissions.
-- NOTE:
-- Stored procedures are created in Master, but are deleted
-- to script all logins, see section /*To Script all sql and windows logins...

/*****************************Start Create needed procedures***************************/
USE master
GO
IF OBJECT_ID ('usp_hexadecimal') IS NOT NULL
DROP PROCEDURE usp_hexadecimal
GO
CREATE PROCEDURE usp_hexadecimal
	@binvalue varbinary(256),
	@hexvalue varchar (514) OUTPUT
AS
	DECLARE @charvalue varchar (514)
	DECLARE @i int
	DECLARE @length int
	DECLARE @hexstring char(16)
	SELECT @charvalue = '0x'
	SELECT @i = 1
	SELECT @length = DATALENGTH (@binvalue)
	SELECT @hexstring = '0123456789ABCDEF'
	WHILE (@i <= @length)
	BEGIN
		DECLARE @tempint int
		DECLARE @firstint int
		DECLARE @secondint int
		SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
		SELECT @firstint = FLOOR(@tempint/16)
		SELECT @secondint = @tempint - (@firstint*16)
		SELECT @charvalue = @charvalue +
		SUBSTRING(@hexstring, @firstint+1, 1) +
		SUBSTRING(@hexstring, @secondint+1, 1)
		SELECT @i = @i + 1
	END
	SELECT @hexvalue = @charvalue
GO

IF OBJECT_ID ('Transfer_login_ServerToServer') IS NOT NULL
	DROP PROCEDURE Transfer_login_ServerToServer
GO

CREATE PROCEDURE Transfer_login_ServerToServer @login_name sysname = NULL AS
	DECLARE @name sysname
	DECLARE @type varchar (1)
	DECLARE @hasaccess int
	DECLARE @denylogin int
	DECLARE @is_disabled int
	DECLARE @PWD_varbinary varbinary (256)
	DECLARE @PWD_string varchar (514)
	DECLARE @SID_varbinary varbinary (85)
	DECLARE @SID_string varchar (514)
	DECLARE @tmpstr varchar (1024)
	DECLARE @is_policy_checked varchar (3)
	DECLARE @is_expiration_checked varchar (3)
	DECLARE @defaultdb sysname

	IF (@login_name IS NULL)
		DECLARE login_curs CURSOR FOR
			SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
			sys.server_principals p LEFT JOIN sys.syslogins l
			ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
	ELSE
		DECLARE login_curs CURSOR FOR
			SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
			sys.server_principals p LEFT JOIN sys.syslogins l
			ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
	OPEN login_curs
	FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
	IF (@@fetch_status = -1) BEGIN
		PRINT '--No login(s) found.'
		CLOSE login_curs
		DEALLOCATE login_curs
		RETURN -1
	END
	SET @tmpstr = '/* Transfer_login_ServerToServer script '
	--PRINT @tmpstr
	SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
	--PRINT @tmpstr
	--PRINT ''
	WHILE (@@fetch_status <> -1) BEGIN
		IF (@@fetch_status <> -2) BEGIN
			PRINT ''
			SET @tmpstr = '-- Login: ' + @name
			PRINT @tmpstr
			IF (@type IN ( 'G', 'U')) BEGIN -- NT authenticated account/group
				SET @tmpstr = 
					'if exists(select top 1 1 from sys.sql_logins where name=''' + REPLACE(REPLACE(@name,'[',''),']','') + ''') ' +CHAR(10)
					+ 'DROP LOGIN ' + QUOTENAME( @name ) + ' ' +CHAR(10)
					+ 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
			END
			ELSE BEGIN -- SQL Server authentication
				-- obtain password and sid
				SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
				EXEC usp_hexadecimal @PWD_varbinary, @PWD_string OUT
				EXEC usp_hexadecimal @SID_varbinary,@SID_string OUT

				-- obtain password policy state
				SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
				SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name

				SET @tmpstr = 
					'if exists(select top 1 1 from sys.sql_logins where name=''' + REPLACE(REPLACE(@name,'[',''),']','')  + ''') ' +CHAR(10)
					+ 'DROP LOGIN ' + QUOTENAME( @name ) + ' ' +CHAR(10)
					+ 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
				IF ( @is_policy_checked IS NOT NULL ) BEGIN
					SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
				END
				IF ( @is_expiration_checked IS NOT NULL ) BEGIN
					SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
				END
			END
			IF (@denylogin = 1) BEGIN -- login is denied access
				SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
			END
			ELSE IF (@hasaccess = 0) BEGIN -- login exists but does not have access
				SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
			END
			IF (@is_disabled = 1) BEGIN -- login is disabled
				SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
			END
			PRINT @tmpstr
		END
		FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
	END
	CLOSE login_curs
	DEALLOCATE login_curs
	RETURN 0
GO
/*****************************End Create needed procedures***************************/

SET NOCOUNT ON
Declare
@List varchar(max),
@DatabaseUserName sysname,
@DB_principal_id smallint,
@ServerUserName sysname,
@RoleName sysname,
@DB_Name sysname,
@cmd varchar(max),
@default_schema_name sysname,
@DB_Nam sysname,
@state_desc sysname,
@permission_name sysname ,
@schema_name sysname ,
@object_name sysname ,
@user_name sysname ,
@Databases varchar(max)=null

/******************************************DATABASE LIST HERE******************************/
/*E.G. 'AdventureWorks,AdventureWorksLT'*/
/*if u wanna generate scripts for all databases, leave @Databases variable null
*/
set @Databases = null

declare @DatabasesTmp varchar(max)=@Databases
Declare @Tbl_DB Table(DB varchar(Max))

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
/******************************************USER LIST HERE******************************/
/*E.G. 'User1, user3,domain\user1,domain\user2'*/
set @List = 'Turgay,Mehmet'
/*To Script all sql and windows logins uncomment below, note this may re-create undesired accounts and
should be modified in the where clause when needed*/
--select @list = isnull(@list,'') + [name] + ',' from master.sys.server_principals where type in ('S','U','G','R','C','K')
if right(@List,1) <> ',' Begin
	set @List = @List + ','
End
Create Table ##DB_USERs
(
	Name sysname,
	DatabaseUserID smallint null,
	ServerUserName sysname null,
	default_schema_name sysname null
)
Create Table ##DB_Roles
(
	Name sysname
)

CREATE TABLE ##syspermissions (
	[DB_Name] [sysname] NULL ,
	[state_desc] [sysname] NULL ,
	[permission_name] [sysname] NULL ,
	[schema_name] [sysname] NULL ,
	[object_name] [sysname] NULL ,
	[user_name] [sysname] NULL,
	[principal_id] [int] NULL
);

CREATE TABLE ##SRV_Roles
(
	SERVERROLE VARCHAR(100),
	MEMBERNAME VARCHAR(100),
	MEMBERSID VARBINARY (85)
);
/*Loop thru file_list*/
while @List <> ''
Begin
	set @DatabaseUserName = left( @List, charindex( ',', @List ) - 1 )
	Print '--BEGIN ' + @DatabaseUserName + ' ************************************'
	Print '--********Begin Script the Login ********************************************************'
	/*Script login with password*/
	Execute Transfer_login_ServerToServer @DatabaseUserName
	Print 'GO'

	/*GET SERVER ROLES INTO TEMPORARY TABLE*/
	SET @CMD = '[MASTER].[DBO].[SP_HELPSRVROLEMEMBER]'
	INSERT INTO ##SRV_Roles EXEC (@CMD)

	Set @CMD = ''
	Select @CMD = @CMD + 'EXEC sp_addsrvrolemember @loginame = ' + char(39) + MemberName + char(39) + ', @rolename = ' + char(39) + ServerRole + char(39) + char(10) + 'GO' + char(10)
	from ##SRV_Roles where MemberName = @DatabaseUserName
	Print '--Assign Server Roles'
	Print @CMD
	Delete ##SRV_Roles
	Print '--********End Script the Login *********************************************************'
	Print ''

	/*Get a table with dbs where login has access*/
	set @DB_Name = ''
	While @DB_Name is not null Begin
		Select @DB_Name = min(name)
		from master.sys.databases
		where name > @DB_Name
			and (isnull(@Databases,'')='' or name in (Select DB from @Tbl_DB))
		IF @DB_Name IS NULL BREAK
		Set @cmd =
			'insert ##DB_USERs
			SELECT '
			+ char(39) + @DB_Name + char(39) + ',' +
			'u.[principal_id],
			l.[name],
			u.default_schema_name
			FROM '
			+ '[' + @DB_Name + '].[sys].[database_principals] u
			INNER JOIN [master].[sys].[server_principals] l
			ON u.[sid] = l.[sid]
			WHERE
			u.[name] = ' + char(39) + @DatabaseUserName + char(39)
		Exec (@cmd)
	End

	/*Add users/roles/object permissions to databases*/
	set @DB_Name = ''
	While @DB_Name is not null Begin
		Select @DB_Name = min(name)
		from ##DB_USERs
		where name > @DB_Name
		if @DB_Name is null BREAK
		Print '/************Begin Database ' + @DB_Name + ' ****************/'
		select @ServerUserName = ServerUserName,@DB_principal_id = DatabaseUserID,@default_schema_name = default_schema_name from ##DB_USERs where name = @DB_Name
		Set @cmd =
		'use [master] ' + CHAR(10) +
		'if exists(select top 1 1 from sys.databases where name=''' + @DB_Name + ''') begin ' + CHAR(10) +
		'exec(''USE [' + @DB_Name + '];' + char(10) +
		'if exists(select top 1 1  from sysusers where name=''''' + @DatabaseUserName + ''''')' + char(10) +
		'exec sp_revokedbaccess ' + @DatabaseUserName + ' ' + char(10) +
		'CREATE USER [' + @DatabaseUserName + ']' + char(10) +
		CHAR(9) + 'FOR LOGIN [' + @ServerUserName + ']' + char(10) +
		CHAR(9) + 'With DEFAULT_SCHEMA = [' + @default_schema_name + ']' + char(10)
		--'GO'
		Print '--Add user to databases'
		Print @cmd

		/*Populate roles for this user*/
		Select @cmd =
		'Insert ##DB_Roles
		Select name
		FROM '
		+ '[' + @DB_Name + '].[sys].[database_principals]
		WHERE
		[principal_id] IN (SELECT [role_principal_id] FROM [' + @DB_Name + '].[sys].[database_role_members] WHERE [member_principal_id] = ' + cast(@DB_principal_id as varchar(25)) + ')'
		--Print @cmd
		Exec (@cmd)

		/*Add user to roles*/
		Set @cmd = ''
		Select @cmd = isnull(@cmd,'') + 'EXEC [sp_addrolemember]' + char(10) +
			CHAR(9) + '@rolename = ''''' + Name + ''''',' + char(10) +
			CHAR(9) + '@membername = ''''' + @DatabaseUserName + ''''''+ char(10)
		from ##DB_Roles

		if len(@cmd) > 0
			Print '--Add user to role(s)'
		Print @cmd

		Delete ##DB_Roles

		/*Object Permissions*/
		Set @cmd =
			'Insert ##syspermissions
			select ' + char(39) + @DB_Name + char(39) + ',a.[state_desc],a.[permission_name], d.[name],b.[name],c.[name],c.[principal_id]
			from '
			+ '[' + @DB_Name + '].sys.database_permissions A
			JOIN ' + '[' + @DB_Name + '].[sys].[objects] b
			ON A.major_id = B.object_id
			JOIN ' + '[' + @DB_Name + '].[sys].[database_principals] c
			ON grantee_principal_id = c.principal_id
			JOIN '+ '[' + @DB_Name + '].sys.schemas d
			ON b.schema_id = d.schema_id'
		Exec (@cmd)
		If exists (select 1 from ##syspermissions where principal_id = @DB_principal_id)
			Print '--Assign specific object permissions'

		DECLARE crs_Permissions CURSOR LOCAL FORWARD_ONLY READ_ONLY
		FOR
			SELECT
			[DB_Name],
			[state_desc],
			[permission_name] ,
			[schema_name] ,
			[object_name] ,
			[user_name]
		FROM
			##syspermissions
		Where
			principal_id = @DB_principal_id
		OPEN crs_Permissions
		FETCH NEXT FROM crs_Permissions INTO @DB_Name,@state_desc,@permission_name ,@schema_name ,@object_name ,@user_name
		WHILE @@FETCH_STATUS = 0 BEGIN
			SET @cmd = 'IF EXISTS(select OBJECT_ID('''''+'[' + @schema_name + '].[' + @object_name + ']'+'''''))'+CHAR(10)+@state_desc + ' ' + @permission_name + ' ON [' + @schema_name + '].[' + @object_name + '] TO [' + @user_name + ']'
			Print @cmd
			FETCH NEXT FROM crs_Permissions INTO @DB_Name,@state_desc,@permission_name ,@schema_name ,@object_name ,@user_name
		END
		CLOSE crs_Permissions
		DEALLOCATE crs_Permissions

		delete ##syspermissions

		Print ''') '+CHAR(10)
			+ ' end'+CHAR(10)
			+ ' GO '

		Print '/************End Database ' + @DB_Name + ' ****************/'
		Print ''
	/*next db*/
	End

	Print '--END ' + @DatabaseUserName + ' ************************************'
	Print ''
	/*Parse the list down*/
	set @List = right( @List, datalength( @List ) - charindex( ',', @List ) )
	/*Clear data for the last user*/
	Delete ##DB_USERs
End

/*Clean up*/
Drop table ##DB_USERs;
Drop table ##DB_Roles;
drop table ##syspermissions;
Drop table ##SRV_Roles;
use master
Drop procedure Transfer_login_ServerToServer
Drop procedure usp_hexadecimal

 

Output Sample

--BEGIN dene ************************************
--********Begin Script the Login ********************************************************
 
-- Login: dene
if exists(select top 1 1 from sys.sql_logins where name='dene') 
DROP LOGIN [dene] 
CREATE LOGIN [dene] WITH PASSWORD = 0x01003303444FFF906398D8A25F5216C6E6DDED27A1FB4DD8C996 HASHED, SID = 0xB1DF9C731B727542869248E4E927AEE0, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF
GO
--Assign Server Roles
 
--********End Script the Login *********************************************************
 
--END dene ************************************
Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


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.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server ın cevap vermediği,yeni connection kabul etmediği ve dolayısıyla adminlerin dahi normal şartlarda bağlanamadığı durumlarda admin ler için troubleshoot amacıyla özel bir bağlantı şekli sunar. Bu bağlantı şekline Dedicated Administrator Connection (DAC) denmektedir.

Local makinadan DAC connection ı yapabilmek için herhangi bir configure ayarı yapmaya gerek yoktur. Fakat remote connection yapılabilmesi için sp_configure ile remote admin connections enable edilmesi gereklidir.

Remote admin connection ın aldığı değerler ve bu değerlerin açıklaması aşağıdaki gibidir.

Değer

Açıklama

0

DAC ile sadece local bağlantı kurulmasını işaret eder

1

DAC ile remote connection da kurulabilmesini sağlar.

Remote admin connection ın value değişikliği için aşağıdaki örnek script i kullanabilirsiniz.

sp_configure 'remote admin connections', 1;
GO
RECONFIGURE;
GO

Bu script ile DAC ile remote connection ı aktif etmiş oluyoruz.

DAC ile Remote connection kuracak user ın sysAdmin rolünde olması gereklidir. Ayrıca DAC connection 1 tane olmak zorundadır. Bir instance a haliahazırda bir DAC kurulduysa ikinci bir DAC connection talebi 17180 error koduyla reddedilir.

Bağlantı kurulurken normalde sadece ServerAdi verilirken DAC bağlantı şeklinde Admin:ServerAdi verilerek bağlantı kurulur. Örn. Admin:sahtiyan_t\SQL10Ent

SQLCMD ile command prompt tan bağlantı kurmak için ise –A parametresi kullanılmalıdır.

Örn: sqlcmd -S sahtiyan_t\SQL10Ent -E –A

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan