2012-09-11 2 views
0

CLR 어셈블리 쌍을 가지고 있으며 반복 가능한 구현 스크립트를 만들려고합니다. 두 어셈블리 모두 EXTERNAL 권한 집합이 필요하므로 비대칭 키가 관련되어있어 문제가 발생합니다. 두 번째로 실행하면 '키를 삭제할 수 없습니다. 로그인이 잘못되었습니다'오류가 발생합니다.SQL Server CLR 어셈블리 반복 가능한 구현?

내가 가지고있는 기타 q는 다음과 같습니다. 데이터베이스 및 서버 수준에서 로그인/키가 필요합니까?

순간 내 스크립트입니다 : 아니오이다 나는 짓을했는지 아무것도가 있다면

USE master 
GO 

IF EXISTS (SELECT * FROM sys.database_principals WHERE name = 'BaselCLRLogin') 
    DROP LOGIN [BaselCLRLogin] 
GO 

IF EXISTS (SELECT * FROM sys.asymmetric_keys WHERE name = 'BaselCLRKey') 
    DROP ASYMMETRIC KEY [BaselCLRKey] 
GO 

USE [BaselST] 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE OBJECT_ID = OBJECT_ID('clr.CheckFileFormat')) 
    DROP PROCEDURE clr.CheckFileFormat 
GO 

IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'BaselCLRLogin') 
    DROP USER [BaselCLRLogin] 
GO 

IF EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'BaselCLR' and is_user_defined = 1) 
    DROP ASSEMBLY [BaselCLR] 
GO 

IF EXISTS (SELECT * FROM sys.asymmetric_keys WHERE name = 'BaselCLRKey') 
    DROP ASYMMETRIC KEY [BaselCLRKey] 
GO 

USE master 
GO 

-- First Create the Asymmetric Key from the Assembly 
CREATE ASYMMETRIC KEY BaselCLRKey 
FROM EXECUTABLE FILE = 'D:\BASEL\BS_Assemblies\BaselCLR.dll' 
GO 

-- Create the Login from the Asymmetric Key 
CREATE LOGIN BaselCLRLogin FROM ASYMMETRIC KEY BaselCLRKey 
GO 

-- Grant the External Access Priviledge to the Login 
GRANT EXTERNAL ACCESS ASSEMBLY TO BaselCLRLogin 
GO 

USE [BaselST] 
GO 

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'clr') 
    EXEC ('CREATE SCHEMA [clr]') 
GO 

-- Add a database user in the SQLCLR_Net Database for the Login 
CREATE USER [BaselCLRLogin] FOR LOGIN [BaselCLRLogin] 
GO 

CREATE ASSEMBLY BaselCLR 
FROM 'D:\BASEL\BS_Assemblies\BaselCLR.dll' 
WITH PERMISSION_SET = EXTERNAL_ACCESS 
GO 

CREATE PROCEDURE clr.CheckFileFormat(
    @fileName nvarchar(255) 
    , @seperator nvarchar(1) 
    , @lineTerminator tinyint 
    , @encoding tinyint 
    , @headerFieldCount int 
    , @bodyFieldCount int 
    , @footerFieldCount int 
    , @reason nvarchar(max) out) 
AS 
EXTERNAL NAME BaselCLR.StoredProcedures.CheckFileFormat 
GO 

, 아니 이제 알려주세요!

답변

1

문제 다음 줄에 ... 당신은 잘못된 시스템 테이블에 로그인 이름을 찾고

IF EXISTS (SELECT * FROM sys.database_principals WHERE name = 'BaselCLRLogin') 

!

sys.syslogins 중에서 선택하십시오.

IF EXISTS (SELECT * FROM sys.syslogins WHERE [sid] = SUSER_SID('BaselCLRLogin')) 
    DROP LOGIN [BaselCLRLogin] 
GO 
0

각 어셈블리마다 다른 키로 서명해야합니다.

+0

dll 파일에서 키를 만들지 않았습니까? 즉 두 개의 분리 된 다른 키가있을 것입니다. 두 번의 로그인이 있지만 어셈블리는 스키마를 공유합니다. 나는 단지 하나의 dll btw에 대한 스크립트를 보여 줬습니다. – cjb110