无法在 SQL Server 2016 Express 中创建或找到架构
Cannot create or find Schema in SQL Server 2016 Express
我的程序在运行时创建数据库和 tables。我对Schema的理解是它是多个数据库和数据库tables的概念文件夹。所以我写了一些无意义的代码只是为了测试模式会对我的代码做什么。
我的程序使用 SQL 服务器身份验证而不是 Windows 身份验证,并在 TmpUser 的用户名下创建数据库和 tables sa。
如果我通过 CREATE TABLE TmpTable
创建 table,我会得到 dbo.TmpTable 作为 table 名称。如果我在 CREATE TABLE abc.TmpTable
中明确键入新模式,则会出现以下异常,因为该模式不存在:
SqlException: The specify schema name either does not exist or you do
not have permission to use it
我进入 SSMS 并通过执行 CREATE SCHEMA abc
手动创建模式。 SSMS 输出表明 abc 的架构已成功创建。但是在 SSMS Object Explorer > Security > 中,我看不到 Schema 名称或任何其他名为 abc 的名称。
我的架构在哪里?如果abc没有被创建,那么为什么CREATE SCHEMA abc
被执行,它创建了什么?
我回到 Visual Studio 并再次创建 TABLE abc.TmpTable,我仍然收到相同的异常。
您的 TmpUser 无权访问架构。
选项 1
CREATE SCHEMA abc AUTHORIZATION TmpUser;
引自https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql:
“授权owner_name
指定将拥有架构的数据库级主体的名称。此主体可能拥有其他架构,并且可能不会使用当前架构作为其默认架构。”
TmpUser 将拥有架构,因此将有权访问它。
选项 2
明确授予 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,但您可以细化权限。
选项 3
将 TmpUser 赋予某些数据库角色,例如db_datareader:
USE MyDatabase
GO
ALTER ROLE db_datareader ADD MEMBER TmpUser
TmpUser 将拥有对数据库中所有模式的读取权限。
选项 4
它类似于选项 3,但不是使用内置角色,而是创建您自己的角色:
USE MyDatabase
GO
CREATE ROLE myrole
GRANT SELECT, DELETE, INSERT, UPDATE, EXECUTE TO myrole
ALTER ROLE myrole ADD MEMBER TmpUser
myrole 中的用户将read/write/execute 访问数据库中的所有模式。
我的程序在运行时创建数据库和 tables。我对Schema的理解是它是多个数据库和数据库tables的概念文件夹。所以我写了一些无意义的代码只是为了测试模式会对我的代码做什么。
我的程序使用 SQL 服务器身份验证而不是 Windows 身份验证,并在 TmpUser 的用户名下创建数据库和 tables sa。
如果我通过 CREATE TABLE TmpTable
创建 table,我会得到 dbo.TmpTable 作为 table 名称。如果我在 CREATE TABLE abc.TmpTable
中明确键入新模式,则会出现以下异常,因为该模式不存在:
SqlException: The specify schema name either does not exist or you do not have permission to use it
我进入 SSMS 并通过执行 CREATE SCHEMA abc
手动创建模式。 SSMS 输出表明 abc 的架构已成功创建。但是在 SSMS Object Explorer > Security > 中,我看不到 Schema 名称或任何其他名为 abc 的名称。
我的架构在哪里?如果abc没有被创建,那么为什么CREATE SCHEMA abc
被执行,它创建了什么?
我回到 Visual Studio 并再次创建 TABLE abc.TmpTable,我仍然收到相同的异常。
您的 TmpUser 无权访问架构。
选项 1
CREATE SCHEMA abc AUTHORIZATION TmpUser;
引自https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql:
“授权owner_name 指定将拥有架构的数据库级主体的名称。此主体可能拥有其他架构,并且可能不会使用当前架构作为其默认架构。”
TmpUser 将拥有架构,因此将有权访问它。
选项 2
明确授予 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,但您可以细化权限。
选项 3
将 TmpUser 赋予某些数据库角色,例如db_datareader:
USE MyDatabase
GO
ALTER ROLE db_datareader ADD MEMBER TmpUser
TmpUser 将拥有对数据库中所有模式的读取权限。
选项 4
它类似于选项 3,但不是使用内置角色,而是创建您自己的角色:
USE MyDatabase
GO
CREATE ROLE myrole
GRANT SELECT, DELETE, INSERT, UPDATE, EXECUTE TO myrole
ALTER ROLE myrole ADD MEMBER TmpUser
myrole 中的用户将read/write/execute 访问数据库中的所有模式。