无法在SQL Server 2016 Express中创建或查找架构

时间:2017-04-26 10:26:58

标签: c# wpf ssms sql-server-2016-express

我的程序在运行时创建数据库和表。我对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,仍然收到同样的异常。

1 个答案:

答案 0 :(得分:1)

您的TmpUser无权访问架构。

选项1

CREATE SCHEMA abc AUTHORIZATION TmpUser;

引自https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql

" AUTHORIZATION 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中的用户将具有对数据库中所有模式的读/写/执行访问权。