在不同的模式中为用户定义的 table 类型创建别名

Create an Alias to a user defined table type in a different schema

我有两个模式,一个包含 tables、存储过程、一般数据(从现在开始将其称为数据模式)。第二个模式里面只有存储过程,我们称之为执行模式。

现在执行模式的重点是让我可以创建一个用户(我们称这个外部用户),它只能访问这个模式并且只能在执行模式中执行存储过程...没有 select、更新、插入、删除任何内容(执行模式中无论如何都没有 table)并且对数据模式的访问权限为零。这样用户的操作就会受到很大的限制。

这里的要点是,当使用“执行模式”创建存储过程时,它会根据需要提升用户权限,而不会实际为外部用户提供执行后的任何权限。

一切顺利,我让它执行并使用测试存储过程从数据模式中获取数据。我现在试图允许执行模式中的一个存储过程使用用户定义的 table 类型,该类型已在数据模式上创建。由于无法看到任何数据模式的用户限制,这被证明是一个问题。

现在我可以重新创建数据类型或将其移动到共享模式...但这是一个实时的旧数据库,理想情况下我不想重复类型或每次我都必须移动用户定义的东西希望允许外部用户访问。

所以我想到了使用别名。虽然当我尝试创建所述别名时出现错误:

命令:

CREATE TYPE [execute].[udtype1] FROM [data].[udtype1] NOT NULL;

错误:

The base type "data.udtype1" is not a valid base type for the alias data type.

虽然我不知道该怎么做,但我注意到微软文档创建了一个 utf8string 并引用了它(我希望这意味着我想做的,可以完成并且存在):

CREATE ASSEMBLY utf8string  
AUTHORIZATION [dbi]   
FROM 0x4D... ;  
GO  
CREATE TYPE Utf8String   
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;  
GO  

有谁知道如何为用户定义的 table 创建别名,或者有其他方法。

引用原问题的评论:

Alias data types are for scalar data types, you can't create an alias data type of a table type. You'll need to give explicit access to the types on the schema here so that the USER's can declare a parameter of the type. – 

用户:Larnu

他给了我几个关键字,这对我的 google 搜索很有帮助。

https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-type-permissions-transact-sql?view=sql-server-ver15

尽管如此,这仍然很奇怪,因为我允许执行并且在授予他们对特定存储过程的权限后,我可以删除权限并且它有效。尝试先删除权限会导致执行失败。