view

作者: 鲸鱼酱375 | 来源:发表于2019-08-25 21:54 被阅读0次

    17.views

    17.1 what is view?

    • A view is often seen as a virtual table
    • It displays data that you choose, but does not actually hold any data
    • Good for security since you can prevent showing extra data
    • DML operations just happen on the table

    VIEWS: View is a permanent DB object and is considered as virtual table. It displays a result set based on multiple/single table for re-usability and security. It only refers to the permanent objects such as a table, view. Views will not improve performance unless we create an index on top of it.

    Rules to follow creating a view

    1. Refer a permanent objects
    2. TOP for ORDER BY clause
    3. VIEW's definition should result in a result set (only DQL statements are possible)
    4. COMPUTE BY is not allowed (don't remember, this option is no longer supported by SS)
      5.No Select Into or Hints allowed

    USES

    1. To restrict data or secure data for certain groups of people
    2. When we want to display static info on some web pages. Ex: Calender, Schedule
    3. Re-usability: If some query is used frequently, instead of writing it multiple times we can create a VIEW
    4. In a report which needs data from multiple tables, instead of matching the data within the report. We can create VIEWS

    rename: SP_RENAME

    view后面只能是select语句

    17.2 Types of Views with Rules

    17.2.1 Regular View

    • Cannot be made with Compute By
    • Order By only with a Top clause
    • No Select Into or Hints allowed
    • Must reference a permanent object

    17.2.2 Schema Bound View / schema binding

    • Must use a two part naming convention when specifying a Schema Bound View
    • You must list each column needed, no Select * is allowed

    advantage: 当table被删除,avoid view变成orphan view

    Options
    1. WITH ENCRYPTION - Encrypts the code used within the VIEW, so that when SP_HelpText is used to view the code it will not be displayed.
    2. WITH CHECK OPTION

    问题::::不能drop 主table, 当它们 reference的时候, 由于view的存在,不能删除主table

    17.3 课上视频代码

    /*
    
    VIEW
    
    */
    
    USE test_db
    
    --CREATE VIEW
    CREATE VIEW EMPINFO AS 
    SELECT *
    FROM AdventureWorks2017.HumanResources.Employee
    GO
    
    SELECT * 
    FROM EMPINFO
    
    --DROP
    DROP VIEW EMPINFO
    
    --ATTENTION: MIDDLENAME MAYBE NULL
    CREATE VIEW EMPINFO AS
    SELECT FirstName+' '+ISNULL(MiddleName+' ','')+LastName AS 'FULL NAME',
            JobTitle,Gender,MaritalStatus
    FROM AdventureWorks2017.HumanResources.Employee
        INNER JOIN AdventureWorks2017.PERSON.PERSON
        ON Employee.BUSINESSENTITYID = PERSON.BUSINESSENTITYID
        
    DROP VIEW EMPINFO
    
    SELECT * FROM EMPINFO
    
    CREATE VIEW EMPINFO AS
    SELECT Employee.BusinessEntityID,FirstName+' '+ISNULL(MiddleName+' ','')+LastName AS 'FULL NAME',
            JobTitle,Gender,MaritalStatus
    FROM AdventureWorks2017.HumanResources.Employee
        INNER JOIN AdventureWorks2017.PERSON.PERSON
        ON Employee.BUSINESSENTITYID = PERSON.BUSINESSENTITYID
        
    --JOIN
    
    SELECT * FROM EMPINFO 
        INNER JOIN AdventureWorks2017.PERSON.PERSON
        ON EMPINFO.BusinessEntityID = PERSON.BusinessEntityID
    
    
        --SCHEMA BOUND VIEW
    
    --ERROR : NAME HAD TO BE DATABASE
    
    CREATE VIEW SCHEMAEMPINFO WITH SCHEMABINDING AS
    SELECT BusinessEntityID,JobTitle,Gender
    FROM AdventureWorks2017.HumanResources.Employee
    
    -- 这个可以成功,因为在test_db有这个schema
    
    CREATE VIEW SCHEMAEMPINFO WITH SCHEMABINDING AS
    SELECT EMPID,NAME,MANAGEDBY
    FROM DBO.EMPLOYEE
    
    在schema view中,不能drop???
    
    
    SELECT * FROM SCHEMAEMPINFO
    
    EXEC SP_HELPTEXT EMPINFO  --可以查看安全信息,创建表格那些代码
    
    ALTER VIEW EMPINFO WITH ENCRYPTION AS
    SELECT Employee.BusinessEntityID,FirstName+' '+ISNULL(MiddleName+' ','')+LastName AS 'FULL NAME',
            JobTitle,Gender,MaritalStatus
    FROM AdventureWorks2017.HumanResources.Employee
        INNER JOIN AdventureWorks2017.PERSON.PERSON
        ON Employee.BUSINESSENTITYID = PERSON.BUSINESSENTITYID
    
        --SHOULD BE NO ONE CAN SEEN WHEN EXEC SP_HELPTEXT 
    加了encryption之后,不可以查看创建的那些代码了
    

    课上笔记
    --orphan view/object
    create view 之后,删除主表,再去查看view 就会报错

    create 
    
    --在schema中,不能select * 所有
    在schema中,就不能drop table
    drop column 也不行,因为这个column在用,除非这个column不在用
    create,drop,update
    
    

    17.4 notes: Restriction

    VIEWS allow DML operations, that would in turn impact underlying table. There are some restrictions for DML operations on VIEWS. Following are some restrictions but there are more.
    1. In VIEW's definition if all columns from a table are not referenced and one of the columns which are not referenced is NOT NULL then VIEWS doesn't allow INSERTING data.
    2. If a view is created using multiple tables and the DML operation is impacting multiple tables it will not be successful.
    3. When using GROUP BY clause, DISTINCT, AGREGATE Functions in the query VIEWS doesn't allow DML operations.
    4. DELETE and UPDATE should satisfy the filtering condition in the view in order to apply the changes
    5. All constraints on the tables should be satisfied
    6. When there are SET operators (UNION, INTERSECT, EXCPT) then DML are not allowed.

    When a WHERE condition is used within the definition of VIEW. DML operations on VIEWS would inherit those conditions. Ex: If a WHERE ID <=100 condition is used in the VIEW's definition. DML (Update and Delete) cannot be performed on values over 100 for ID. But Inserts are fine.

    17.5 WITH SCHEMA BINDING

    • When a VIEW is defined as SCHEMA BINDING, columns referenced in the VIEW cannot be altered/dropped(DDL) and tables referenced cannot be dropped. But new columns can be added and columns which are not referenced in the VIEW can be altered/dropped to the underlying table.

    • schemabinding view does not allow any DDL operations on columns referred in the view

    • ddl operations allowed on columns not referred in schemabinding view

     CREATE TABLE dbo.Licenses
    (
     Id    int IDENTITY(1,1) PRIMARY KEY,
     Name  varchar(100),
     RUser nvarchar(128) DEFAULT USER_NAME()
    )
    GO
    
    CREATE VIEW dbo.rLicenses with schemabinding
    AS
    SELECT Name
    FROM   dbo.Licenses
    WHERE  RUser = USER_NAME()
    go
    
    INSERT INTO dbo.rLicenses (name) VALUES ('test')
    

    17.6 WITH CHECK OPTION

    • When a VIEW is defined with CHECK OPTION user will not be able to insert data which violates the condition defined in the VIEW. Ex: WHERE ID < = 100 WITH CHECK OPTION, user will not be able to insert data with ID value greater than 100.
    • It is used to restrict DML operations on the view according to search predicate (WHERE clause) specified creating a view.
    • Users cannot perform any DML operations that do not satisfy the conditions in WHERE clause while creating a view.
    • WITH CHECK OPTION has to have a WHERE clause.

    The following example shows a view named SeattleOnly that references five tables and allows for data modifications to apply only to employees who live in Seattle.

    CREATE VIEW dbo.SeattleOnly  
    AS  
    SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode  
    FROM HumanResources.Employee e  
    INNER JOIN Person.Person p  
    ON p.BusinessEntityID = e.BusinessEntityID  
        INNER JOIN Person.BusinessEntityAddress bea   
        ON bea.BusinessEntityID = e.BusinessEntityID   
        INNER JOIN Person.Address a   
        ON a.AddressID = bea.AddressID  
        INNER JOIN Person.StateProvince sp   
        ON sp.StateProvinceID = a.StateProvinceID  
    WHERE a.City = 'Seattle'  
    WITH CHECK OPTION ;  
    GO  
    

    17.7 VIEW WITH ENCRYPTION

    • Sp_helptext helps you see the syntax of the view created. To prevent the syntax view, we need to encrypt it
    • So create a view with encryption.

    The following example uses the WITH ENCRYPTION option and shows computed columns, renamed columns, and multiple columns.
    https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-2017

    CREATE VIEW Purchasing.PurchaseOrderReject  
    WITH ENCRYPTION  
    AS  
    SELECT PurchaseOrderID, ReceivedQty, RejectedQty,   
        RejectedQty / ReceivedQty AS RejectRatio, DueDate  
    FROM Purchasing.PurchaseOrderDetail  
    WHERE RejectedQty / ReceivedQty > 0  
    AND DueDate > CONVERT(DATETIME,'20010630',101) ;  
    GO  
    

    17.8 question: select into can't use in view

    We can't use select into in view but we can use views in select into clause

    17.9 dirrerence between regular view and complex view?

    complex view is the schema view/encryption view/with check view

    1. Select * allowed in Regular.. Not allowed in schemabinding
    2. Can create a view from another db in regular view whereas schemabinding requires to be created from the db because of 2 part naming convention
    3. Regular view allows DDL operations on columns in underlying tables, wheres schemabinding does not

    how update complex view?
    use triggers

    benefit of SCHEMABINDING
    https://www.mssqltips.com/sqlservertip/4673/benefits-of-schemabinding-in-sql-server/

    17.10 refresh regular view

    When a VIEW (Non Sch Binding) uses SELECT * in its definition and there is a structural change (add a column/ drop a column)
    in the underlying table, VIEW needs to be refreshed
    Refreshing Options

    1. Use ALTER VIEW statement
    2. Use SP_REFRESHVIEW system procedure

    17.11 当存在view的时候,原table

    Tables Alter Drop
    column ref in view no no
    column not ref on view yes yes
    drop ref table no no

    17.12 例子

    当我们有四个不同地点的同一个部门要建立数据库
    两种办法:

    • view
    • create different schema

    17.13 compare

    compare view Schema-binding View
    DDL yes yes
    SELECT INTO no no
    JOIN yes yes
    DML yes(restriction) yes(restriction)
    DDL yes yes
    indentity no yes
    change base table yes yes
    drop yes yes
    * yes no
    insert into(当创造view的时候) no no

    17.14 alter view

    alter view v_name
    select a,b, cast( c as int)
    from t_name
    

    相关文章

      网友评论

          本文标题:view

          本文链接:https://www.haomeiwen.com/subject/hjokectx.html