【问题标题】:SQL Server CLR Assembly Repeatable Implementation Ordering?SQL Server CLR 程序集可重复实现排序?
【发布时间】:2012-09-11 09:46:51
【问题描述】:

我有一对 CLR 程序集,我正在尝试创建一个可重复的实现脚本。 两个程序集都需要 EXTERNAL 权限集,所以我还涉及到非对称密钥,这些都会导致问题。当您第二次运行它时,您会收到“无法删除密钥,登录映射到它”错误。

我对此的其他一些问题是: 我需要数据库和服务器级别的登录名/密钥吗?

目前我的脚本是:

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

如果我做过的其他事情不是,请告诉我!

【问题讨论】:

    标签: .net sql-server sql-server-2008-r2 implementation


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      您必须使用不同的密钥签署每个程序集。

      【讨论】:

      • 从脚本中我不是从 dll 文件创建密钥吗?即我将有两个单独且不同的键。我有两个登录名,但程序集共享架构。顺便说一句,我只展示了一个 dll 的脚本。
      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2014-08-27
      • 2016-05-22
      • 2020-11-14
      相关资源
      最近更新 更多