【发布时间】:2021-12-23 10:20:05
【问题描述】:
我有两种模式,一种包含表、存储过程、一般数据(从现在开始将其称为数据模式)。第二个模式只有存储过程,我们称之为执行模式。
现在执行模式的重点是我可以创建一个用户(我们将称之为外部用户),该用户只能访问此模式并且只能在执行模式中执行存储过程...没有选择,更新,插入,删除任何内容(执行模式中无论如何都没有表)并且对数据模式的访问权限为零。这样,用户可以做的事情就会受到很大限制。
这里的要点是,当使用“执行架构”创建存储过程时,它会根据需要提升用户权限,而实际上并未授予外部用户执行该执行后的任何权限。
一切都很好,我让它执行并使用测试存储过程从数据模式中获取数据。我现在正试图允许执行模式中的存储过程之一使用用户定义的表类型,该类型是在数据模式上创建的。由于用户无法看到任何数据架构的限制,这被证明是一个问题。
现在我可以重新创建数据类型或将其移动到共享模式...但这是一个活的旧数据库,理想情况下我不想重复类型或每次我希望移动用户定义的东西允许外部用户访问。
所以我考虑使用别名。尽管当我尝试创建所述别名时出现错误:
命令:
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.
虽然我不知道该怎么做,但我注意到 microsoft 文档创建了一个 utf8string 并引用它(我希望这意味着我想要做的,可以完成并且存在):
CREATE ASSEMBLY utf8string
AUTHORIZATION [dbi]
FROM 0x4D... ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO
有谁知道如何为用户定义的表创建别名,或者有其他方法。
【问题讨论】:
-
别名数据类型适用于标量数据类型,不能创建表类型的别名数据类型。您需要在此处显式访问架构上的类型,以便
USER可以声明该类型的参数。 -
您是否介意通过以下链接将其作为答案,我会将这个问题标记为已回答。 docs.microsoft.com/en-us/sql/t-sql/statements/…
标签: sql-server azure tsql user-defined-types