SQL CLR: Streaming table valued function results

前端 未结 3 2165
滥情空心
滥情空心 2021-02-10 15:24

My issue is very similar to this issue.

However, I\'m using SQL Server 2005 Service Pack 2 (SP2) (v9.0.3042) and the solution posted there does not work for me. I tried

3条回答
  •  醉话见心
    2021-02-10 16:03

    Upon further research and trial and error I found my solution. The article that I mentioned here says

    your assembly must be created with permission_set=external_access

    This is much easier said than done, but was a good starting point. Simply using that line in place of permission_set=safe gives the error:

    CREATE ASSEMBLY for assembly 'assemblyName' failed because assembly 'assemblyName' is not authorized for PERMISSION_SET = EXTERNAL_ACCESS. The assembly is authorized when either of the following is true: the database owner (DBO) has EXTERNAL ACCESS ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with EXTERNAL ACCESS ASSEMBLY permission.

    So the first thing I had to do was sign my dll file. To do that in Visual Studio 2010, you go to the project properties, Signing tab, and check "Sign the assembly" and give it a name. For this example, the name is MyDllKey. I chose not to protect it with a password. Then, of course, I copied the dll file to the sql server: C:\Temp

    Using this page as a reference, I created a SQL login based on the above key using these 3 commands:

    CREATE ASYMMETRIC KEY MyDllKey FROM EXECUTABLE FILE = 'C:\Temp\MyDll.dll'
    CREATE LOGIN MyDllLogin FROM ASYMMETRIC KEY MyDllKey
    GRANT EXTERNAL ACCESS ASSEMBLY TO MyDllLogin
    

    Once the login is created as above, I can now create the assembly using this:

    CREATE ASSEMBLY [MyDll]
    FROM 'C:\Temp\MyDll.dll'
    WITH PERMISSION_SET = EXTERNAL_ACCESS
    

    Now the only thing left to do is use the proper connection string. Apparently using enlist=false in combination with connection=true is not possible. Here is an example of the connection string I used.

    string connStr = @"data source=serverName\instanceName;initial catalog=DBName;integrated security=SSPI;enlist=false";
    

    And it works!

提交回复
热议问题