在SQL Server里面SCHEMABINDING是什么意思

如题所述

数据库架构schema实现了,数据库对象与数据库用户直接映射的分离,用户与数据库对象可以通过schema来映射控制。
数据库对象(视图,表,函数等)可以属于某个schema.数据库用户可以属于某个schema,表示拥有某个schema下对象的权限。如果未指定,数据库对象属于架构(schema)dbo,sa用户默认属于dbo架构(dbo:database owner)。当用户访问数据库对象时,如采用server..objects时默认寻找对应schema下的数据库对象:比如用户tmp_user属于schema:tmp,则上述访问默认转变成:server.tmp.objects.
创建用户,并指定用户默认的schema:

PgSQL
CREATE LOGIN [User_tmp] WITH PASSWORD = N'123456'
CREATE USER [User_tmp] FOR LOGIN [User_tmp] WITH DEFAULT_SCHEMA = [tenant]

1
2

CREATE LOGIN [User_tmp] WITH PASSWORD = N'123456'
CREATE USER [User_tmp] FOR LOGIN [User_tmp] WITH DEFAULT_SCHEMA = [tenant]

创建scheme:

PgSQL
CREATE SCHEMA [tenant] AUTHORIZATION [dbo]

1

CREATE SCHEMA [tenant] AUTHORIZATION [dbo]

给schema设置权限:

PgSQL
GRANT INSERT, SELECT, UPDATE, DELETE, EXECUTE, REFERENCES ON SCHEMA:: [tenant] TO User_tmp

1

GRANT INSERT, SELECT, UPDATE, DELETE, EXECUTE, REFERENCES ON SCHEMA:: [tenant] TO User_tmp

创建带schema的数据库对象,比如创建一个视图:

PgSQL
CREATE VIEW tenant.PrinterCookies
WITH SCHEMABINDING
AS
SELECT ticket_no, user_agent, create_date, create_by
FROM dbo.PrinterCookies
GO

1
2
3
4
5
6

CREATE VIEW tenant.PrinterCookies
WITH SCHEMABINDING
AS
SELECT ticket_no, user_agent, create_date, create_by
FROM dbo.PrinterCookies
GO

注意:带WITH SCHEMABINDING标记时,如果对应的表做了修改(增加字段除外),需要删除原视图,再去修改对应的物理表,再建带schema的视图。
用户登录时,只显示他所在schema下的所有数据库对象,如上述用户只显示带tenant的对象,无法查看其它dbo的数据库对象。但tenant的所有者是dbo,所以dbo下可以看到所有tenant的对象。
同样的,因为之前给tenant分配了数据库的增,删,改查权限,可以对tenant下的数据对象作相应的操作权限。
当使用下面的SQL语句时:SELECT * FROM SqlTest..PrinterCookies,当用用户[User_tmp]登录查找时,会匹配到SqlTest.tenant.PrinterCookies视图对象,而用dbo登录时,会匹配到SqlTest.dbo.PrinterCookies物理表对象。当然,各自查询呈现的数据是不一样的。
综上所述,基于schema的不同,我们可以规约出很多不同的权限。同时,根据schema的默认匹配,可将数据库的物理表逻辑往上层通过schema来管理控制。从而让不同的登录用户,有差别的访问同一个数据库资源,达到数据管理的目的。
温馨提示:答案为网友推荐,仅供参考