SQL CLR Trigger, How to make an assembly trusted due to transparent code call critical code?
Why is SQLCLR code only trusted partially?
By default, CLR code running inside of SQL Server (i.e. "SQLCLR") is highly restricted so as to not degrade security or stability of SQL Server.
How do you make SQLCLR fully trusted?
What the CLR code within an Assembly can do is controlled (mostly) by the PERMISSION_SET
property of each Assembly. If you do not specify a PERMISSION_SET
when loading the Assembly via CREATE ASSEMBLY
, the default will be SAFE
which is the most restricted and not fully trusted. In order for the CLR code to be able to reach outside of SQL Server (to the network, file system, OS, etc.) you would need to set the Assembly to at least EXTERNAL_ACCESS
, but this is still not fully trusted. In order to be considered fully trusted you need to set the Assembly to UNSAFE
.
In order to set any Assembly to either EXTERNAL_ACCESS
or UNSAFE
, you need to do one of the following:
- Sign the Assembly with a password, create an Asymmetric Key from the Assembly, create a Login from the Asymmetric Key, grant the Login the
UNSAFE ASSEMBLY
permission. This is the preferred method. - Set the database containing the Assembly to
TRUSTWORTHY = ON
. This assumes that the owner of the database has theUNSAFE ASSEMBLY
server-level permission (which is typically the case). While this option is quicker / easier, it is not preferred due toTRUSTWORTHY = ON
being a fairly wide-open security hole.
If you want a more detailed look at SQLCLR security, especially in relation to how restricted SAFE
Assemblies are, check out this article that I wrote on SQL Server Central.