我的程序在运行时创建数据库和表。我对Schema的理解是它是一个用于多个数据库和数据库表的概念文件夹。所以我写了一些毫无意义的代码,只是为了测试一下我的代码将采用什么模式。
我的程序使用SQL Server身份验证而不是Windows身份验证,并使用 TmpUser 的用户名而不是 sa 创建数据库和表。
如果我按CREATE TABLE TmpTable
创建一个表格,我会获得表格名称的 dbo.TmpTable 。如果我在CREATE TABLE abc.TmpTable
中显式键入新架构,那么我会得到以下异常,因为架构不存在:
SqlException:指定的模式名称要么不存在,要么不存在 没有权限使用它
我进入SSMS并通过执行CREATE SCHEMA abc
手动创建架构。 SSMS输出表示已成功创建abc的模式。但是在SSMS中对象资源管理器>安全> 我看不到架构名称,也没有其他名称 abc 。
我的架构在哪里?如果未创建 abc ,那么为什么CREATE SCHEMA abc
已执行且它创建了什么?
我再次回到Visual Studio和CREATE TABLE abc.TmpTable,仍然收到同样的异常。
答案 0 :(得分:1)
您的TmpUser无权访问架构。
CREATE SCHEMA abc AUTHORIZATION TmpUser;
引自https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql:
" AUTHORIZATION owner_name 指定将拥有该架构的数据库级主体的名称。此主体可能拥有其他模式,并且可能不使用当前模式作为其默认模式。"
TmpUser将拥有该架构,因此将具有访问它的权限。
明确授予TmpUser权限:
GRANT SELECT, UPDATE, DELETE, INSERT SCHEMA abc TO TmpUser;
请参阅https://docs.microsoft.com/en-us/sql/t-sql/statements/grant-schema-permissions-transact-sql
上的用法它与选项1类似,但您可以使用谷物权限。
将TmpUser放入某些数据库角色,例如的db_datareader:
USE MyDatabase
GO
ALTER ROLE db_datareader ADD MEMBER TmpUser
TmpUser将具有对数据库中所有模式的读访问权。
它与选项3类似,但不是使用内置角色,而是创建自己的角色:
USE MyDatabase
GO
CREATE ROLE myrole
GRANT SELECT, DELETE, INSERT, UPDATE, EXECUTE TO myrole
ALTER ROLE myrole ADD MEMBER TmpUser
myrole中的用户将具有对数据库中所有模式的读/写/执行访问权。