2015-01-20 6 views
3

사용자 만들기 스크립트가있는 DACPAC가 있습니다. 사용자가 Windows 도메인 사용자로 로그인해야합니다. 테스트/스테이징/릴리스 빌드를 수행 할 때 사용자가 로그인 할 때 다른 도메인과 사용자를 적용 할 수 있어야합니다.도메인 사용자 로그인이 가변적 인 사용자 스크립트 만들기

은 우리가 SQLCMD 변수를 사용할 수있을 거라고 생각하지만, 난 그냥 사용하려고 SQL71501 오류를 얻을이 그 스크립트는 다음과 같은 :

CREATE USER [Username] 
    For Login [$(SQLLoginDomain)] 
    WITH DEFAULT_SCHEMA = [SCHEMANAME] 
GO 
+0

포럼 사이트와 달리, 우리는 "감사합니다"를 사용하지 않는 ... DACPAC의 배포 후 스크립트에서 이런 식으로 뭔가를 넣을 수 있습니다, 또는 "어떤 도움을 주시면 감사", 또는 [so]의 서명. "[안녕하세요, '고마워,'태그 라인 및 인사말을 게시물에서 삭제해야합니까?] (http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be 참조) -removed-from-posts). –

답변

1

우리는 dacpac에서 배포 후 스크립트를 사용하여이 문제를 해결했으며 사용자가 이미 존재하는지 확인하기 전에 확인 작업을 수행하는 동안에는 사용할 수있는 유일한 장소이므로 모두 작동합니다 사전 배포 스크립트를 차단합니다.

1
쓰라린 경험을 바탕으로 내 조언이 환경은 그 어떤 것도 유지하는 것입니다

귀하의 SQL Server 데이터베이스 프로젝트에서 특정. 오히려 DACPAC가 배포 된 후 별도의 T-SQL 스크립트로 환경 관련 항목 (퍼미션 등)을 적용하십시오. 릴리스 관리에서이 작업을 수행하는 경우 DACPAC 게시 및 별도 사용 권한 스크립트 here이 포함 된 스프레드 - 너트 블로그 시리즈가 있습니다. 토큰 화 된 사용 권한 스크립트 적용에 대한 게시물은 here입니다.

+0

감사하지만 우리는 그것을 원했던 곳을 찾았지만 우리가 할 수있는 일을 추적하기가 매우 어려울 수도 있습니다. – TechLiam

0

sys.dm_exec_sessions 시스템보기에서 Windows 도메인을 읽을 수 있습니다.

예를 들어, 당신은

DECLARE @host_name nvarchar(128); 
DECLARE @nt_domain nvarchar(128); 

SELECT 
    @host_name = host_name, 
    @nt_domain = nt_domain 
FROM 
    sys.dm_exec_sessions 
WHERE 
    session_id = @@SPID; 

-- If the domain is present, setup the login/user. 
-- Otherwise, we are probably running under test environment, so we can skip this. 
-- `@nt_domain = @host_name` tends to hold for LocalDB. 

IF @nt_domain IS NOT NULL AND @nt_domain <> @host_name BEGIN 

    DECLARE @user_nonquoted nvarchar(128) = @nt_domain + '\YourUserName'; 
    DECLARE @user nvarchar(128) = QUOTENAME(@user_nonquoted); 

    IF @user_nonquoted NOT IN (SELECT name FROM sys.database_principals) 
     EXEC ('CREATE LOGIN ' + @user + ' FROM WINDOWS'); 
    IF @user_nonquoted NOT IN (SELECT name FROM sys.server_principals) 
     EXEC ('CREATE USER ' + @user + ' FOR LOGIN ' + @user); 

END