我认为模式是名称空间实例,因此在2个不同模式下创建的同一个表是从数据库角度看的2个不同的对象。我的一位同事声称模式只不过是一个安全容器,因此我们可以在不同的模式中创建相同的表。这是真的?
答案 0 :(得分:13)
你是对的。
CREATE TABLE foo.T
(
c int
)
和
CREATE TABLE bar.T
(
c int
)
创建2个单独的对象。您可以创建一个同义词 bar.T
,但是foo.T
别名。
CREATE SCHEMA foo
GO
CREATE SCHEMA bar
GO
CREATE TABLE foo.T(c INT)
GO
CREATE SYNONYM bar.T FOR foo.T;
INSERT INTO foo.T VALUES (1);
SELECT * FROM bar.T;
答案 1 :(得分:2)
它们是两个不同的对象,请检查object_id
答案 2 :(得分:1)
是的,它可以。试试吧
CREATE SCHEMA OneSchema AUTHORIZATION dbo;
CREATE SCHEMA TwoSchema AUTHORIZATION dbo;
CREATE TABLE dbo.SomeTable (foo int);
CREATE TABLE OneSchema.SomeTable (foo int);
CREATE TABLE TwoSchema.SomeTable (foo int);
架构既是安全又是“命名空间”的一部分
答案 3 :(得分:0)
myschema.table1
与yourschema.table1
答案 4 :(得分:0)
我想您正在尝试通过在不同租户之间划分具有相同数据结构的数据来解决问题。您不想使用其他数据库来降低成本。
在我看来,在这种情况下最好使用行级安全性。在这种情况下,数据存储在一个表中,但是一个租户无法访问另一租户创建的数据。
您可以在下一篇文章中进一步了解-Row-Level Security